C++与Lua闭包

起因

做游戏开发多少会接触lua,其中闭包也是挺常见的一种了,因为使用lua闭包的缘故,我就尝试着在C++使用lambda来写个。

代码分析

以下是lua的闭包代码:

function fun1(param1)
	local i = param1
	return function()
		i = i + 1
		return i
	end
end

local 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<int> i = make_shared<int>(_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++代码我就不解释了,跟上面差不多的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章