ue4 c++ 模板中的一个小技巧

Posted zhangxiaofan666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ue4 c++ 模板中的一个小技巧相关的知识,希望对你有一定的参考价值。

今天看到一行代码很有意思

我们就看115行CreateStatic的参数,先说第二个参数,是一个可变参数的typename,该typename通过函数模板传递过来,再看第一个参数,稍微有点复杂,从外向内看

typename 一坨东西 InFunc

这个格式是将这一坨东西定义为InFunc

再看这一坨东西

TIdentity<RetValType (*)(ParamTypes..., VarTypes...)>::Type

如上图所示,将其拆成

TIdentity<另一坨东西>::Type

其中TIdentity这个名称是T开头可知是模板

另一坨东西如下面的代码

RetValType (*)(ParamTypes..., VarTypes...)

这是个函数的指针,该函数有两个可变参数ParamTypes和VarTypes,返回值为RetValType

 

我们再看看TIdentity这个模板

其变量Type就是将模板类型返回回去

 

看到这里就有人问了。。

WTF???

那这么说TIdentity<RetValType (*)(ParamTypes..., VarTypes...)>::Type的意思其实就是RetValType (*)(ParamTypes..., VarTypes...)

干嘛非要用模板将类型包一层,然后再将类型返回去,多此一举嘛!

 

其实真正的原因是:

如果这样写

template <typename T>
 void Func(T Val);

那么会通过Func(123)或者Func<int>(123)两种方式去实现

但是如果这样写:template <typename T>
 void Func(typename TIdentity<T>::Type Val);

那么只能通过Func<int>(123)去实现

 

到这里读者就大概明白了,有的人会问,那为啥我看有的函数调用该接口,比如下图,在CreateStatic函数后应该加上<模板类型>,为什么没有呢?难道不对吗?

我的理解是

TIdentity<RetValType (*)(ParamTypes..., VarTypes...)>::Type

是限制这个指针指向的函数返回值必须是个带有模板类型的返回值,如果不带模板类型,是编译不过的

不妨看下FNiagaraStaticSwitchNodeDetails::MakeInstance的实现,果然是这样的

 

读到这里,应该明白为什么要这样做了吧,关于模板的这个小技巧,你学废了吗?

 

 

打个广告:

关于字节跳动的内推岗位

本内推适用于校招和社招的一切岗位(策划,测试,游戏,运营等岗位)

内推的好处是可以更快的让HR看到自己的简历,增加面试通过率。有意向投递字节的同学可以看下

 

关于校招的链接

https://job.toutiao.com/s/J4SpBAG

关于社招的链接

https://job.toutiao.com/s/J4SW41T

以上是关于ue4 c++ 模板中的一个小技巧的主要内容,如果未能解决你的问题,请参考以下文章

ue4 c++代码怎么获取场景中的一个actor

《UE4开发笔记》Tip 0 Rider的五个必备技巧

UE4小技巧

[UE4]小技巧:自动添加函数返回值

UE4 小技巧

[UE4]Canvas Panel应用小技巧