C++语言中的闭包
来源:互联网 发布:数据备份方案 编辑:程序博客网 时间:2024/06/15 09:14
在大多数函数式语言中,不允许函数有副作用,即函数不能访问或改变外部状态(比如全局变量),这样做极大方便了单元测试和bug 定位以及并发,但是在一些函数式语言中对函数副作用的要求稍稍放宽了限制,引入了词法闭包(lexical closure),允许函数可以保留自己的context, 以便设计出传出值是函数的函数。例如:
erlang中这样实现闭包,
MakeTest = fun(L) -> (fun(X) -> lists:member(X,L) end) end.
要使用这个闭包,
Fruit = [apple, pear, orange].
IsFruit = MakeTest(Fruit).
测试如下:
IsFruit(pear)返回true
IsFruit(apple)返回true
IsFruit(dog)返回false
闭包得巧妙之处就在于MakeTest已经返回了但是其参数Fruit依然被IsFruit保存在自己的上下文中,并在接卸来的调用中使用。
其实在C++中也可以实现这样的机制,而且多年之前就广泛使用了。
接下来实现一个相同功能的C++版本.
- template<class TContainer>
- struct Closure
- {
- public:
- Closure(TContainer const& c):mCollection(c)
- {
- }
- public:
- bool operator()(typename TContainer::value_type const& val)
- {
- typename TContainer::iterator i = std::find(mCollection.begin(), mCollection.end(), val);
- return i != mCollection.end();
- }
- private:
- TContainer mCollection;
- };
- template<class TContainer>
- Closure<TContainer> MakeTest(TContainer& c)
- {
- return Closure<TContainer>(c);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- enum Fruit{apple, pear, orange};
- enum Animal{dog = 100};
- std::vector<int> v;
- v.push_back(apple);
- v.push_back(pear);
- v.push_back(orange);
- Closure<std::vector<int> > IsFruit = MakeTest(v);
- bool bRet = IsFruit(pear);
- bRet = IsFruit(apple);
- bRet = IsFruit(dog);
- return 0;
- }
- 语言中的闭包
- C++语言中的闭包
- 编程语言中的闭包
- Go语言中的闭包
- Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。
- Swift语言中的闭包运算(Closure)
- 理解Go语言中的函数闭包
- Objective-C中的Block(闭包)
- Objective-C基于C语言闭包Block的实现
- Java中的“import 包”类似于 VS C语言中的“#include 头文件
- 闭包(Closures)在各种语言中的例子
- 【Go学习】理解Go语言中的函数闭包
- 传递闭包计算warshall算法C语言实现
- C语言中的static
- C语言中的指针
- C语言中的sizeof
- C 语言中的随机数
- c语言中的指针
- Where to get a great massage in shanghai
- 数理逻辑:10元钱的故事
- 解决网上邻居为何访问不畅通的方法
- IT管理人才必备的十大能力
- 网络测试在信息化建设中的作用
- C++语言中的闭包
- 亲爱的你是我今生等待的人
- vsftp的配置
- javascript捕获窗口关闭事件
- XP如何通过网上邻居访问VISTA共享文件
- 浅谈PHP缓存技术之一
- BMP文件格式分析
- 设计CDib类
- Memcache协议中文版