c – boost.rangeと一緒にboost.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

簡潔にするために、別の関数ではなくラムダを使用したいと思います。

ベストアンサー
オペレーター。オーバーロードすることはできません。したがって、プレースホルダーに対して賢明なことはできません。

Boost.Lambda(およびBoost.LambdaをベースとしたBoost.Phoenix v1およびv2)は、TR1 result_ofプロトコルではなく独自のresult_ofプロトコルを実装しているため、Boost.Lambda関数はboost :: result_ofまたはstdを使用したものでは機能しません。 :tr1 :: result_of(Boost.Rangeと同じ)

そうは言っても、Boost 1.47でリリースされる予定のBoost.Phoenix v3は、Boost.Lambdaの正式な代替品であり、TR1のresult_ofプロトコルを実装しているので、boost :: result_of(したがってBoost.Range)でもうまく機能します。

あなたのオプションはBoost.Lambdaの代わりにBoost.Bindを使うことです、その場合、以下は有効です:

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

あるいは、Boost.Lambdaの代わりにBoost.Phoenix v3を使用することもできます(今すぐトランクからBoost.Phoenixを取得するか、Boost 1.47を待つ)。その場合、Boost.Bind構文が有効になります。

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

転載記事の出典を記入してください: c – boost.rangeと一緒にboost.lambdaを使ってコンテナから選択する方法 - コードログ