lambda表达式
ue5委托
ue的委托使用宏来进行声明,对参数个数和返回值个数要求不一样可以使用不同的宏来声明。下面是一个有一个返回值,无参数的委托
DECLARE_DELEGATE_RetVal(bool,State_SwapFunc);
值捕捉
s.eS是对象的一个枚举FsmState的字段,这里会返回两个枚举值的比对结果,当我们为这个委托绑定一个值捕获的lamdba表达式时,eS的值会一直保持被捕获时的值,我在捕获之前没有对这个值进行修改,该值是uint类型的最大值。
State_SwapFunc func1; func1.BindLambda([s](){return (s.eS==FsmState::s2);});
引用捕获
引用捕获就是在捕获的时候前面加一个&符。
State_SwapFunc func1; func1.BindLambda([&s](){return (s.eS==FsmState::s2);});
以前一直知道这个知识点,一直使用C#没有想起来,调试了几次才想起这个问题,现记录。
表达式作为方法参数
曾一度不知道怎么把一个表达式作为参数去传递,其实模板就可以解决。感叹c++的神奇,就是不知道这样奇怪的语法,它的语法树是啥样的。
template<typename MLAMBDA> void Command(MLAMBDA Lambda) { lambda(); }
表达式作为对象字段
当我们 可以把方法存储为对象的字段的时候,我们就把这个对象作为多线程的上下文对象。
这份代码目前有问题,c2280,做了多次尝试没有解决
template<typename MLAMBDA> class LamdbaCommand { public: void Lamdba(MLAMBDA&& inl) //移动构造 理论上可以解决c2280报错 { lamdba = inl; } LamdbaCommand() {}; ~LamdbaCommand() { } void Execute() { lambda(); } private: MLAMBDA lamdba; }; template<typename MLAMBDA> void Command(MLAMBDA&& Lambda) { typedef LamdbaCommand<MLAMBDA> type; LamdbaCommand<MLAMBDA>* t= (LamdbaCommand<MLAMBDA>*)malloc(sizeof(LamdbaCommand<MLAMBDA>)); t->Lamdba(Forward<MLAMBDA>(Lambda)); //t->Execute(); //S_NEW(t)type (Forward<MLAMBDA>(Lambda)); //TBB内存申请 }

浙公网安备 33010602011771号