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内存申请
}

 

posted @ 2022-12-14 09:58  过往云烟吧  阅读(88)  评论(0)    收藏  举报