2011-06-14 37 views
4

在C#中使用LINQ,我会写:如何使用boost.lambda和boost.range从容器中进行选择?

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

我不知道语法应该是什么C++ /λ/范围。我只是试图将一些对象类型的容器调整到一个字符串容器,以便我可以将它传递给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,而不是一个单独的函数的赘述。

回答

3

operator.不可重载,因此它永远无法对占位符做任何明智的事情。


Boost.Lambda(和Boost.Phoenix v1和v2,它是基于Boost.Lambda)实现了自己的result_of协议,而不是TR1的result_of协议,所以Boost.Lambda函子将不使用任何与工作boost::result_ofstd::tr1::result_of(如Boost.Range所做的那样)。

这就是说,Boost.Phoenix V3,预计在升压1.47发布,是Boost.Lambda正式替代和确实实现TR1的result_of协议,所以确实起到很好的与boost::result_of(并因此提升。范围)。

你的选择是要么使用Boost.Bind代替Boost.Lambda,在这种情况下,以下是有效的:

transformed(bind(&myObjectType::myMember, _1)) 

,或者你可以使用V3的Boost.Lambda代替Boost.Phoenix(要么得到提升。凤凰现在干掉或等待升压1.47),在这种情况下,Boost.Bind语法是有效的,以及以下替代:

transformed(_1->*&myObjectType::myMember) 
+0

非常好。但不能编译boost 1.43(使用lambda方法,而不是phoenix): boost/iterator/transform_iterator.hpp(43):error C2039:'result_type':不是'boost :: lambda :: lambda_functor的成员 '' – 2011-06-14 21:46:40

+0

@MattChambers:编辑的答案。 – ildjarn 2011-06-14 21:57:27

+0

如果期待result_of为什么它抱怨result_type? :/ BLL支持在函数对象类中声明带有名为result_type的成员typedef的函数对象的返回类型的标准库约定。 – 2011-06-14 22:04:59

相关问题