`
feipigwang
  • 浏览: 746240 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于 Boost.Lambda

J# 
阅读更多
Boost.Lambda 的确是一个好东西,用来举例最多的恐怕就是这个了:

using namespace boost::lambda;

std::vector<int> v;
// init values

std::for_each(v.begin(), v.end(), std::cout << _1 << ' ');

精致、优雅、易于理解,下面是一个更漂亮的例子:

std::map<int, int> values;
// init values

std::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,可能也和这些实现上的问题有关吧。













分享到:
评论

相关推荐

    THE BOOST C++ LIBRARIES

    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....

    Boost带领你远远地超越了C++标准库,它使得C++编程更优雅、更有活力、更高产。首先,我们系统地介绍一下Boost库的主要组成和它们的主要用法

    Björn Karlsson为中级至高级的C++开发者描述了所有58...可在调用点进行定义的函数对象:Boost.Bind 和 Boost.Lambda 更灵活的回调机制:Boost.Function 可管理的信号和响应动作(又称为Observer模式):Boost.Signals

    Beyond.the.C++ - Standard.Library.An.Introduction.to.Boost

    practice solutions for performing type conversions and lexical conversions &lt;br&gt;Utility ...Boost.Lambda &lt;br&gt;More flexible callbacks with Boost.Function &lt;br&gt;Managed signals and slots (a.k.a....

    Beyond the C++ Standard Library An Introduction to Boost

    practice solutions for performing type conversions and lexical conversions &lt;br&gt;Utility ...Boost.Lambda &lt;br&gt;More flexible callbacks with Boost.Function &lt;br&gt;Managed signals and slots (a.k.a....

    Boost库定制安装更新版

     Lambda  在调用的地方定义短小匿名的函数对象,很实用的functional功能  concept check  检查泛型编程中的concept  Mpl  用模板实现的元编程框架  Thread  可移植的C++多线程库  Python  把C++类和函数...

    boost 1.41 中文文档,使用帮助,教程手册

    汉化 boost 文档,致力 boost 推广。 如果你对本项目有兴趣,欢迎加入,相关说明请查阅项目论坛: https://groups.google.com/ 到目前为止,各人贡献的译文如下: 贡献者 贡献的译文 alai04 accumulators, any, ...

    Boost 程序库完全开发指南

    boost 是 C++ 所谓的...boost 包含大量设计精巧、功能强大、性能卓越的组件,如智能指针、函数对象、lambda表达式、线程、文件系统、网络、状态机、模板元编程等。C++ 程序员在 boost 上的耕耘,必可获得丰厚的回报。

    Boost C++扩展库

    Lambda 在调用的地方定义短小匿名的函数对象,很实用的functional功能;concept check 检查泛型编程中的concept;Mpl 用模板实现的元编程框架;Thread 可移植的C++多线程库;Python 把C++类和函数映射到Python之中;...

    THE BOOST C++ METAPROGRAMMING LIBRARY

    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...

    C++中Boost库裁剪与其应用详解

    Boost 库涵盖的范围极广,有字符串和文本处理相关子库比如 format 库和 regexp 库,有容器相关子库比如 variant 库(和 Qt 的 QVariant 有得一拼),有迭代器子库比如 tokenizer 库(可以把字符进行 tokenize),...

    boost培训文档

    BOOST是由c++标准化委员...Boost库覆盖了广泛的领域,从数学库到智能指针,从模板元编程库到预处理器库及语法词法分析,从线程到lambda表达式,等等。所有Boost库都具有宽松的许可证,确保库可以被自由使用于商用软件。

    aws-saas-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 ...

    Modern C++ Programming Cookbook

    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 ...

    C++标准库介绍.pdf

    Lambda 在地方定义短小匿名对象很实用functional功能 concept check 检查泛型编程中concept Mpl 用模板实现元编程框架 Thread 可移植C多线程库 Python 把C类和映射到Python的中 Pool 内存池管理 smart_ptr 5个智能...

    mpl:元编程库旨在提高编译速度

    关键设计决策的简短列表: 编译时间的速度至关重要延续风格的公共界面算法和Lambda的零成本构成无缝集成“ continuations as lambda”语法代码准则为了保持磁带库性能,清洁和易于使用,必须考虑一些准则。...

    CxxWrap.jl:用于使C ++库在Julia中可用的软件包

    该软件包旨在为Julia提供针对C ++类型和函数的类似于Boost.Python的包装。 这个想法是用C ++编写Julia包装器的代码,然后在Julia一侧使用单线来使包装的C ++库在那儿可用。 该程序包背后的机制是,函数和类型在C +...

    通用日志类

    一个日志类,采用了boost库的对象序列化、环形缓冲区、文件系统库、线程库、datetime库,同时也使用了boost的字符串转换工具以及C++11的lambda,功能强大。项目工程只需要配置好boost库即可。相信此工程不仅可以用来...

    C++ function、bind以及lamda表达式

    本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间...

    【精品资源】c++高级编程第三版包含中英文版本涵盖源码

     ◆ 使用C++14的全新语言功能,包括函数返回类型推断、二进制字面量、泛型lambda和lambda捕捉表达式  ◆ 使用全新标准库功能,例如make_unique、透明函数对象,通过类型寻址的元组、共享mutex和锁类

Global site tag (gtag.js) - Google Analytics