Boost.Lambda 的确是一个好东西,用来举例最多的恐怕就是这个了:
using namespace boost::lambda;std::vector<int> v;// init valuesstd::for_each(v.begin(), v.end(), std::cout << _1 << ' ');精致、优雅、易于理解,下面是一个更漂亮的例子:
std::map<int, int> values;// init valuesstd::for_each(values.begin(), values.end(), std::cout << bind(&std::map<int,int>::value_type::first, _1) << '\t' << bind(&std::map<int,int>::value_type::second, _1) << '\n');它将把一个 map 打印成表格形式,其中的 bind 是 boost::lambda::bind,而不是 boost::bind。
看起来都是那么的轻易,但是我在下面的代码上却遇到了麻烦:
std::map<int,int>::iterator iter = bind(&std::map<int,int>::find, &values, _1)(boost::cref(1));任我使尽浑身解数,它还是没能编译成功,要知道这种情况经常给出几公里长的出错信息,要从中了解问题的症结几乎不太可能。然而,下面这一句非常相似的却成功运行:
std::cout << bind(&std::map<int,int>::count, &values, _1)(boost::cref(1));一个是 bind 到 find,一个是 bind 到 count ,它们有什么区别呢?看看 STL(VC7.1) 的实现就发现,find 有两个版本:const 和 mutable ,而 count 只有一个版本。
难道是 Boost.Lambda 在遇到 constness 重载的时候出了问题?验证一下:
class A{ int i, j;public: int& I() { return i; } const int& I()const { return i; } int J() { return j; }}a;//.......std::cout << bind(&A::I, _1)(a);果然不假,上面的代码编译的时候给出类似的错误信息,而下面这一句则没有问题:
std::cout << bind(&A::J, _1)(a);
然而,如果换用 Boost.Bind ,则在两种情况下都可以正确运行,包括上面所说的 count 和 find 。不过,最妙的是只要拿掉
using namespace boost::lambda;
而改用
using namespace boost;
那么同样的代码无需修改就可以运行了。
我还没有仔细看 Boost.Lambda 的代码来确定到底发生了什么,但是 C++0x 标准并没有接纳 lambda,可能也和这些实现上的问题有关吧。
分享到:
相关推荐
3.5 Boost.Lambda 3.6 Exercises Chapter 4: Event Handling 4.1 General 4.2 Signals 4.3 Connections 4.4 Exercises Chapter 5: String Handling 5.1 General 5.2 Locales 5.3 Boost.StringAlgorithms 5.4 Boost....
Björn Karlsson为中级至高级的C++开发者描述了所有58...可在调用点进行定义的函数对象:Boost.Bind 和 Boost.Lambda 更灵活的回调机制:Boost.Function 可管理的信号和响应动作(又称为Observer模式):Boost.Signals
practice solutions for performing type conversions and lexical conversions <br>Utility ...Boost.Lambda <br>More flexible callbacks with Boost.Function <br>Managed signals and slots (a.k.a....
practice solutions for performing type conversions and lexical conversions <br>Utility ...Boost.Lambda <br>More flexible callbacks with Boost.Function <br>Managed signals and slots (a.k.a....
Lambda 在调用的地方定义短小匿名的函数对象,很实用的functional功能 concept check 检查泛型编程中的concept Mpl 用模板实现的元编程框架 Thread 可移植的C++多线程库 Python 把C++类和函数...
汉化 boost 文档,致力 boost 推广。 如果你对本项目有兴趣,欢迎加入,相关说明请查阅项目论坛: https://groups.google.com/ 到目前为止,各人贡献的译文如下: 贡献者 贡献的译文 alai04 accumulators, any, ...
boost 是 C++ 所谓的...boost 包含大量设计精巧、功能强大、性能卓越的组件,如智能指针、函数对象、lambda表达式、线程、文件系统、网络、状态机、模板元编程等。C++ 程序员在 boost 上的耕耘,必可获得丰厚的回报。
Lambda 在调用的地方定义短小匿名的函数对象,很实用的functional功能;concept check 检查泛型编程中的concept;Mpl 用模板实现的元编程框架;Thread 可移植的C++多线程库;Python 把C++类和函数映射到Python之中;...
This paper describes the Boost C++ template metaprogramming library (MPL), an extensible compile-time framework of algorithms, sequences and metafunction classes. The library brings together important...
Boost 库涵盖的范围极广,有字符串和文本处理相关子库比如 format 库和 regexp 库,有容器相关子库比如 variant 库(和 Qt 的 QVariant 有得一拼),有迭代器子库比如 tokenizer 库(可以把字符进行 tokenize),...
BOOST是由c++标准化委员...Boost库覆盖了广泛的领域,从数学库到智能指针,从模板元编程库到预处理器库及语法词法分析,从线程到lambda表达式,等等。所有Boost库都具有宽松的许可证,确保库可以被自由使用于商用软件。
AWS SaaS 提升 概述 AWS SaaS Boost 为组织提供随时可用的核心软件元素,以便在云中成功运行 SaaS 工作...“助手”Lambda 函数 功能/alb-更新 租户服务使用启用/禁用来修改租户的负载均衡器访问权限 功能/ecs-部署 侦听
虽然可以用std的bind或者boost的lambda,但是对于某些嵌套情况,用起来非常麻烦,这个库提供了下面的一些解决方式: sometimes STL algorithm is not good and it needs one traival function object(third ...
Get going with unit testing frameworks Boost.Test, Google Test and Catch, Extend your C++ knowledge and take your development skills to new heights by making your applications fast, robust, and ...
Lambda 在地方定义短小匿名对象很实用functional功能 concept check 检查泛型编程中concept Mpl 用模板实现元编程框架 Thread 可移植C多线程库 Python 把C类和映射到Python的中 Pool 内存池管理 smart_ptr 5个智能...
关键设计决策的简短列表: 编译时间的速度至关重要延续风格的公共界面算法和Lambda的零成本构成无缝集成“ continuations as lambda”语法代码准则为了保持磁带库性能,清洁和易于使用,必须考虑一些准则。...
该软件包旨在为Julia提供针对C ++类型和函数的类似于Boost.Python的包装。 这个想法是用C ++编写Julia包装器的代码,然后在Julia一侧使用单线来使包装的C ++库在那儿可用。 该程序包背后的机制是,函数和类型在C +...
一个日志类,采用了boost库的对象序列化、环形缓冲区、文件系统库、线程库、datetime库,同时也使用了boost的字符串转换工具以及C++11的lambda,功能强大。项目工程只需要配置好boost库即可。相信此工程不仅可以用来...
本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间...
◆ 使用C++14的全新语言功能,包括函数返回类型推断、二进制字面量、泛型lambda和lambda捕捉表达式 ◆ 使用全新标准库功能,例如make_unique、透明函数对象,通过类型寻址的元组、共享mutex和锁类