在带有 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 而不是单独的函数。
最佳答案
operator.
不可重载,因此它永远不会对占位符做任何明智的事情。
Boost.Lambda(以及基于 Boost.Lambda 的 Boost.Phoenix v1 和 v2)实现了自己的 result_of 协议(protocol)而不是 TR1 result_of 协议(protocol),因此 Boost.Lambda 仿函数将无法与使用 boost::result_of
或 std::tr1::result_of
的任何东西(如 Boost.Lambda)一起使用。范围确实)。
也就是说,计划在 Boost 1.47 中发布的 Boost.Phoenix v3 是 Boost.Lambda 的官方替代品,并且确实实现了 TR1 result_of 协议(protocol),因此与 boost::result_of
(以及 Boost.Range)配合得很好。
您的选择是使用 Boost.Bind 而不是 Boost.Lambda,在这种情况下,以下内容有效:
transformed(bind(&myObjectType::myMember, _1))
或者您可以使用 Boost.Phoenix v3 而不是 Boost.Lambda(现在将 Boost.Phoenix 从主干中取出或等待 Boost 1.47),在这种情况下 Boost.Bind 语法是有效的,以及以下替代方案:
transformed(_1->*&myObjectType::myMember)