本文转载于YivanLee知乎作者
专题目录链接:https://zhuanlan.zhihu.com/p/67694999
这几天研究了一下虚幻4的delegate,但是想要理解这个,还得从仿函数说起。下面是一段代码例子:
class MyFunctor
{
public:
int operator()(int x) { return x * 2;}
}
MyFunctor doubler;
int x = doubler(5);
The real advantage is that a functor can hold state.
class Matcher
{
int target;
public:
Matcher(int m) : target(m) {}
bool operator()(int x) { return x == target;}
}
Matcher Is5(5);
if (Is5(n)) // same as if (n == 5)
{ ....}
现在还可以使用std::function
#include
#include
#include
using namespace std;
class MyCharacter
{
public:
void BeHurt01(int hurtvalue)
{
cout << "hurt01" << hurtvalue << endl;
}
void BeHurt02(int hurtvalue)
{
cout << "hurt02" << hurtvalue << endl;
}
};
class OtherCharacter
{
public:
functionThisIsDelegate;
};
int main()
{
MyCharacter mycha;
OtherCharacter othecha;
othecha.ThisIsDelegate = bind(&MyCharacter::BeHurt01, &mycha, placeholders::_1);
othecha.ThisIsDelegate(19);
return 0;
}
这样做的好处就是实现延迟调用,比如我现在有个主角和一个怪物。因为需要完成动画播放,主角的出招的特效播放之后才会执行怪物受伤扣血的逻辑。这时候可以先在主角出招的时候探测周围的怪物然后给他们绑定上伤害函数。
相对于函数指针,std::function能绑定c++里的所有可调用对象,stdfunction相当于帮我们封装了一个模板。
比如:
(1)首先我们建立一个第三人称c++模板工程
然后打开代码,在MyProjectCharacter.h中声明一个代理,两个与之匹配的函数
在构造函数中将函数和代理绑定
在MoveForward函数里执行这个代理
完成绑定工作后我们到gamemode类里做如下工作
至此我们就可以在游戏执行后,按下w键之后的log里看到如下的输出