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
相关推荐
鲨鱼辣钊1 小时前
【FastAPI筑基-Day19】APScheduler定时任务全实战|自动执行、动态启停、后台常驻
java·spring·fastapi
恋恋西风6 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
学长毕业设计6 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
Brilliantwxx6 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
东小西6 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西6 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午6 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065256 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
BizzZ_7 小时前
C++(22)——类型转换和IO流
开发语言·c++
小范同学_7 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言