记录点之前没见过的UE C++奇技淫巧

发布于 2023-09-07  193 次阅读


使用TArray.Emplace时可用参数直接构造临时对象

使用Emplace函数添加结构体时,可以直接在括号中填写结构体的成员参数,而不需要进行显示转换。这是因为Emplace函数会自动根据参数类型调用结构体的构造函数来创建新的结构体对象。

struct MyStruct
{
    int32 x;
    int32 y;

    MyStruct(int32 InX, int32 InY)
        : x(InX)
        , y(InY)
    {
    }
};
TArray<MyStruct> MyArray;

// 添加一个MyStruct对象
MyArray.Emplace(1, 2);

// 添加另一个MyStruct对象
int32 X = 3;
int32 Y = 4;
MyArray.Emplace(X, Y);

使用模版函数进行相同操作的大量复用

class InworldPacketCreator : public Inworld::PacketVisitor
{
public:
	virtual ~InworldPacketCreator() = default;

	virtual void Visit(const Inworld::TextEvent& Event) override { Create<FInworldTextEvent, Inworld::TextEvent>(Event); } //Packet = std:make_shared<FInWorldTextEvent>(Inworld::TextEvent& event);
	virtual void Visit(const Inworld::DataEvent& Event) override { Create<FInworldDataEvent, Inworld::DataEvent>(Event); }
	virtual void Visit(const Inworld::AudioDataEvent& Event) override { Create<FInworldAudioDataEvent, Inworld::AudioDataEvent>(Event); }
	virtual void Visit(const Inworld::SilenceEvent& Event) override { Create<FInworldSilenceEvent, Inworld::SilenceEvent>(Event); }
	virtual void Visit(const Inworld::ControlEvent& Event) override { Create<FInworldControlEvent, Inworld::ControlEvent>(Event); }
	virtual void Visit(const Inworld::EmotionEvent& Event) override { Create<FInworldEmotionEvent, Inworld::EmotionEvent>(Event); }
	virtual void Visit(const Inworld::CustomEvent& Event) override { Create<FInworldCustomEvent, Inworld::CustomEvent>(Event); }

	std::shared_ptr<FInworldPacket> GetPacket() { return Packet; }

private:
	template<typename TNew, typename TOrig>
	void Create(const TOrig& Event)
	{
		Packet = std::make_shared<TNew>(Event);
	}

	std::shared_ptr<FInworldPacket> Packet;
};

等价于

Packet = std:make_shared<FInWorldTextEvent>(Inworld::TextEvent& event);

C++后缀为.ini的是什么文件

在C++中,后缀为.inl的文件通常是用于实现模板类或内联函数的文件。由于模板类和内联函数的实现通常需要放在头文件中,因此为了避免头文件过大,可以将模板类或内联函数的实现放在后缀为.inl的文件中,然后在头文件中包含该文件,以便进行编译。

CPP复制// MyTemplateClass.inl

template<typename T>
void MyTemplateClass<T>::MyFunction()
{
    // 实现代码
}

然后,在MyTemplateClass.h头文件中包含MyTemplateClass.inl文件,如下所示:

CPP复制// MyTemplateClass.h

#pragma once

template<typename T>
class MyTemplateClass
{
public:
    void MyFunction();
};

#include "MyTemplateClass.inl"

这样,就可以将模板类的实现和头文件分离开来,使得代码更加清晰和易于维护。

需要注意的是,后缀为.inl的文件并不是C++标准中定义的文件类型,而是一种约定俗成的命名方式。因此,在使用后缀为.inl的文件时,需要遵循约定俗成的命名方式,并在头文件中包含该文件,以便进行编译。