类似C#的泛型函数
特点:
1 声明和实现必须都在头文件内进行,cpp只能调用
2 默认是inline
示例:
cpp
//头文件内
public:
//定义
template<typename T>
T Avg(T first,T second);
//实现
template <typename T>
T AItem::Avg(T first, T second)
{
return ((first+second)/2 );
}
//源文件调用
FVector avgVector = Avg<FVector>(GetActorLocation(),FVector::ZeroVector);
限制数据类型
都要写在实现处
方法1 :使用断言
cpp
template <typename T>
T AItem::Avg(T first, T second)
{
// 限制:T 必须是指针类型
static_assert(std::is_pointer_v<T>, "T 必须是指针!");
return T();
}
方法2: c++17以上,使用requires关键字
cpp
template <typename T>
requires std::is_arithmetic_v<T> // 直接限制:只能是数字
T AItem::Avg(T a, T b)
{
return (a + b) / 2;
}
方法3: UE引擎提供
cpp
template <typename T>
T AItem::Avg(T a, T b)
{
// T 必须是 AActor 或其子类
static_assert(TIsDerivedFrom<T, AActor>::Value, "必须是Actor子类");
return T();
}
常用的断言类型
cpp
// 数字类型(int float double)
std::is_arithmetic_v<T>
// 指针类型
std::is_pointer_v<T>
// 空类型
std::is_void_v<T>
// 是 UObject 子类
TIsDerivedFrom<T, UObject>::Value
// 是 AActor 子类
TIsDerivedFrom<T, AActor>::Value
// 是 UActorComponent 子类
TIsDerivedFrom<T, UActorComponent>::Value