博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++与Lua闭包
阅读量:3787 次
发布时间:2019-05-22

本文共 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/

你可能感兴趣的文章
基本类型包装类
查看>>
System类常用方法
查看>>
Runtime类、Math类和Random类的常用方法
查看>>
数据处理类常用方法
查看>>
Collections和Character类 常用静态方法
查看>>
HTML之Javascript——BOM浏览器对象模型
查看>>
JAVA基础中的基础
查看>>
JDBC基础操作
查看>>
连接池
查看>>
Servlet的使用——重定向和转发
查看>>
JSP技术的使用——好像过时了唉。。。。。
查看>>
MVC模式概述
查看>>
Web之过滤器Filter
查看>>
JSON和AJAX
查看>>
web之监听器listener
查看>>
类加载器
查看>>
数据库设计
查看>>
Java虚拟机的内存分配和运行机制(粗谈)
查看>>
web开发之BaseServlet的使用
查看>>
初识Maven
查看>>