C++项目中怎么实现闭包
今天就跟大家聊聊有关C++项目中怎么实现闭包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
示例
#include <iostream>#include <string>class Closure {public: Closure() {} ~Closure() {} virtual void Run() = 0; //纯虚函数};template <typename Arg1>class FunctionClosure1 : public Closure {public: typedef void (*FunctionType)(Arg1); FunctionClosure1(FunctionType f, Arg1 arg1) : _f(f), _arg1(arg1) { } ~FunctionClosure1() { } virtual void Run() { _f(_arg1); delete this; }private: FunctionType _f; Arg1 _arg1;};template <typename Arg1>Closure* NewCallback(void(*function)(Arg1), Arg1 arg1) { return new FunctionClosure1<Arg1>(function, arg1);}// 带一个参数的函数template<typename type>void foo(type data) { std::cout << "foo data=" << data << std::endl;}int main(){ Closure* closure; closure = NewCallback(foo<std::string>, std::string("titus")); //等价于 closure = new FunctionClosure1<std::string>(foo<std::string>, std::string("titus")); closure->Run(); //自己释放 delete closure return 0;}
Closure 定义为纯虚类,不能实例化,必须由子类实现它的虚函数后再才能实例化。
FunctionClosure1 为 Closure 的子类,定义为模版类,可以定制传入参数的类型。它有两个私有成员,函数指针成员 _f,参数 _arg1,在成员方法 Run 中会让函数 _f 传入参数 _arg1 进行调用。而函数指针成员是在类初始化时传入的,相当于函数也是可以定制的。运行完之后 delete this,这是因为 NewCallback 在堆上 new 了一个对象,这里自动进行资源释放,当然也可以自己释放。
NewCallback 是一个辅助函数,用来生成子闭包类,它需要传入函数指针和参数。
在使用时,父指针指向 NewCallback创建的子类,同时传入函数指针和参数,最后调用子类继承实现的 Run 方法。
这么看来,闭包可以看成是对回调函数的封装。
标准库写法
头文件引入 functional 标准库,用 C++11 的写法也可以实现上述例子
std::function<void(string)> std_closure=foo;std_closure(string("test std"));
使用 lambda 表达式
std::function<void()> std_closure = []() {foo(string("test lambda"));};std_closure();
看完上述内容,你们对C++项目中怎么实现闭包有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341