私はPhoenixv3で遊んでいて、現在のBindとLambdaの組み合わせではなく、標準化する必要があるかどうかを判断しようとしています。ドキュメントから、いくつかの表現を単純化することが可能であるはずだという印象を受けました。
現在、STLアルゴと組み合わせた->*演算子の使用に固執しています。以下はコンパイルされますが(Visual Studio 2008 SP1)、期待される出力は得られません。
#include <algorithm>
#include <iostream>
#include <vector>
#include <boost/mem_fn.hpp>
#include <boost/phoenix.hpp>
using namespace std;
using namespace boost;
using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;
struct A
{
void f() const { cout << "A"; };
};
struct B
{
A a() { return A(); };
};
int main()
{
vector<A> va(1);
for_each(va.begin(), va.end(), bind(mem_fn(&A::f), arg1));
for_each(va.begin(), va.end(), arg1->*&A::f);
vector<B> vb(1);
for_each(vb.begin(), vb.end(), bind(mem_fn(&A::f), bind(mem_fn(&B::a), arg1)));
return 0;
}
この例を実行すると、バインドベースのループの場合は両方とも「A」が2回出力されます。だからここに私の質問があります:
- オペレーターベースのループで実際にA::fを呼び出すには、何を変更する必要がありますか?
- 演算子を使用してダブルバインドループを変更するにはどうすればよいですか?
- このような場合にmem_fnを指定しないと、VS2008が常に文句を言う理由を知っている人はいますか?私は常に警告C4180を受け取ります(関数型に適用された修飾子は意味がありません;無視されます)。
洞察を事前に感謝します。