在使用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), ", ");
但显然这不起作用或我不会在这里。 ;)
为简洁起见,我想使用lambda而不是单独的函数。
答案 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