lambda+mutable配合move实现单函数多程序域

主代码

//-----------------------------------说明一的代码
void fun0{
    int t = 10;
    auto loopFun = [=]() mutable{
        t--;
    }
    timer.SetTimer(*timerHandle, loopFun, 1.0f, true);
}
//-------------------------------------说明二的代码
void SetTimer(FTimerHandle& InOutHandle, TFunction<void(void)>&& Callback, float InRate, bool InbLoop, float InFirstDelay = -1.f )
{
	InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(MoveTemp(Callback)), InRate, InbLoop, InFirstDelay);
}

说明一

C++ lambda 是struct值,存于栈
未加mutable时 t 不可变。加了 t 可变,不影响上级程序域。

lambda 拆解

void fun0(){
    int t = 10;
    struct loopFun_t
    {
        loopFun_t() {}
        void operator()()
        {
            t--;
        }
        const int t = 10;
    }
    loopFun_t();
}

https://www.zhihu.com/question/25740516/answer/56820797 WZsayiie

说明二

TFunction<void(void)>&& Callback,这个是右值引用,使用栈内存(临时内存)时的语法。
配合 MoveTemp 将右值引用的内存移动到需要保存的地方,省却了拷贝,清理。
UE4的TFunction 是 std::function,MoveTemp 是 std::move。

https://blog.csdn.net/fenghen777/article/details/46741995#commentBox
http://www.cnblogs.com/chezxiaoqiang/archive/2012/10/24/2736630.html

实现总结

lambda是栈内存程序域,在下次运行上级函数时必然被覆盖,但有了右值引用,将lambda的内存移到别的地方,下次运行时就覆盖不到了,这样原lambda有了独立程序域。

posted @ 2018-05-16 10:47  晨祷  阅读(464)  评论(0编辑  收藏  举报