如何使用boost.lambda和boost.range从容器中进行选择?

时间:2011-06-14 21:34:20

标签: c++ boost stl lambda

在使用Linq的C#中,我会写:

myContainer.Select(o => o.myMember);

我不确定C ++ / lambda / range的语法是什么。我只是试图将一些对象类型的容器改编为字符串容器,以便我可以将它传递给boost :: algorithm :: join。我试过像:

using namespace boost::adaptors;
using namespace boost::lambda;
string result = join(myContainer | transformed(_1.myMember), ", ");

但显然这不起作用或我不会在这里。 ;)

我在阅读后使用转换: http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/adaptors/reference/transformed.html

为简洁起见,我想使用lambda而不是单独的函数。

1 个答案:

答案 0 :(得分:3)

operator.不会超载,因此它永远不会对占位符做任何明智的事情。


Boost.Lambda(以及Boost.Phoenix v1和v2,它们基于Boost.Lambda)实现了自己的result_of协议而不是TR1 result_of协议,因此Boost.Lambda仿函数不能使用{{1}的任何东西}或boost::result_of(如Boost.Range所做的那样)。

也就是说,Boost.Phoenix v3,计划在Boost 1.47发布,是Boost.Lambda的官方替代品, 实现TR1 result_of协议,因此与{{{ 1}}(以及Boost.Range)。

您的选择是使用Boost.Bind而不是Boost.Lambda,在这种情况下,以下内容有效:

std::tr1::result_of

或者您可以使用Boost.Phoenix v3而不是Boost.Lambda(现在从主干中获取Boost.Phoenix或等待Boost 1.47),在这种情况下Boost.Bind语法有效,以及以下替代方案:

boost::result_of