UE5 c++ 模板函数

类似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
相关推荐
松仔log1 分钟前
Jetpack——DataStore
java·kotlin
咸鱼翻身小阿橙3 分钟前
文件读写 + Qt Model/View + 自定义分页+搜索过滤
java·数据库·qt
在繁华处5 分钟前
Java从零到熟练(十):JVM基础与性能优化
java·jvm·性能优化
草莓熊Lotso6 分钟前
【Linux网络】深入理解 HTTP 协议(一):从基础概念到 URL 编码解码
linux·网络·c++·网络协议·http·软件工程
眠りたいです6 分钟前
现代C++:C++17中的新语言特性
开发语言·c++·c++17
一只旭宝8 分钟前
【C++入门精讲17】序列容器
开发语言·c++
Demon1_Coder8 分钟前
Day1-SpringAI-1.0.0版本
java·开发语言·前端
老码观察13 分钟前
设计模式实战解读(九):责任链模式——流水线上层层把关的艺术
java·设计模式·责任链模式
郝学胜-神的一滴15 分钟前
Qt 高级开发 021:零基础吃透 QVBoxLayout 垂直布局
开发语言·c++·qt·程序人生·用户界面