本文共 1434 字,大约阅读时间需要 4 分钟。
做游戏开发多少会接触lua,其中闭包也是挺常见的一种了,因为使用lua闭包的缘故,我就尝试着在C++使用lambda来写个。
以下是lua的闭包代码:
function fun1(param1) local i = param1 return function() i = i + 1 return i endendlocal test1 = fun1(1)local test2 = fun1(1) print("test1_1...." .. test1())print("test1_2...." .. test1())print("test2_1...." .. test2())print("test2_2...." .. test2())
如果对闭包不了解来看看输出结果如何?
现在知道结果了,让我们来分析分析这段代码吧!
已经了解闭包的小伙伴可以跳过这段
从输出上分析: test1与test2的值可以看出是互不影响的,并且同一个test1执行多次后值是叠加的,说明这个i并没有像我们写C++时候函数执行完就销毁。为了简单的比喻,在看到闭包时,你可以把他想象成一个类,并结合闭包结构分析,可以想成如下:
class fun1(){public: fun1(int _i) : i(_i) {} int GetAddOneNum() { return ++i; }private: int i;}
我们将上面lua代码比作先创建一个 fun1 类对象 test1,而 test1() 则比作为 test1.GetAddOneNum();,是不是就好像刚刚闭包的执行结果了?如果觉得不太形象你可以尝试着吧GetAddOneNum改写为重载 () 这个运算符。
闭包则是一个函数在带上了状态,让这个函数有了自己的变量如刚刚的 i 变量。
我们按照lua的模板来写一个C++代码。
return function() i = i + 1 return i end 返回的不就是一个函数吗,那我们C++中使用lambda就行了,而有个问题是变量,我们在C++中并不能像lua那样,我们执行完 fun() 函数后 i 就被销毁了,所以改下成了如下代码,动态的给他分配内存,防止内存管理上的问题不用犹豫用智能指针。 以下是改装后的C++代码:auto fun(int _i){ shared_ptr i = make_shared (_i); return [=]() -> int { *i += 1; return *i; };}int main(){ auto test1 = fun(1); auto test2 = fun(100); std::cout << "test1_1..." << test1() << std::endl; std::cout << "test1_2..." << test1() << std::endl; std::cout << "test2_1..." << test2() << std::endl; std::cout << "test2_2..." << test2() << std::endl; return 0; }
看看执行结果吧?
实验得真知,从结果上可以看出方法是可行的,而这段C++代码我就不解释了,跟上面差不多的。
转载地址:http://ycktn.baihongyu.com/