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
相关推荐
她说..2 小时前
Spring单例Bean线程安全问题 深度解析
java·后端·安全·spring·springboot
吴梓穆2 小时前
UE5 c++ 暴露变量和方法给蓝图
java·c++·ue5
浅念-2 小时前
LeetCode 双指针题型 C++ 解题整理
开发语言·数据结构·c++·笔记·算法·leetcode·职场和发展
风向决定发型丶2 小时前
Java 线程池 vs Go GMP
java·开发语言·golang
zzb15802 小时前
Agent案例-智能文档问答助手
java·人工智能·笔记·python
Mr_Xuhhh2 小时前
LeetCode hot 100(C++版本)
c++·leetcode·哈希算法
cccyi72 小时前
【C++ 脚手架】cpp-httplib 与 websocketpp 库的介绍与使用
c++·websocket·http
故事和你912 小时前
洛谷-入门6-函数与结构体
开发语言·数据结构·c++·算法·动态规划
老四啊laosi2 小时前
[C++进阶] 21. 红黑树
c++·红黑树