1

私はブーストラムダを学んでいます(c++ 0Xラムダではないと思いますが、それらは異なると思います)。しかし、唯一の入力パラメーターが呼び出しオブジェクトである場合、オンラインでメンバー関数を呼び出す (そして結果を出力する) 方法を見つけることができません。つまり、この行は機能します:

for_each(vecCt.begin(), vecCt.end(), cout<<_1<<endl);

vecCt が のvector場合int。しかし、 vecCt が、文字列を返すために呼び出される関数を持つvectorof の場合はどうなるでしょうか? これも:MyClassgetName

for_each(vecCt.begin(), vecCt.end(), cout<<_1->getName());

これも:

for_each(vecCt.begin(), vecCt.end(), cout<<*_1.getName());

動作します。

私はオンラインで検索しましたが、多くの結果は、メンバー関数を呼び出すときに bind を使用することを提案しています。今、私はこれを知っています

for_each(vecCt.begin(), vecCt.end(), bind(&MyClass::getName, _1);

getNameint が渡された各オブジェクトを呼び出すことができますが、この出力を cout に渡すにはどうすればよいですか? これは機能しません:

for_each(vecCt.begin(), vecCt.end(), cout<<bind(&MyClass::.getName, _1);
4

1 に答える 1

1

boost::、global のプレースホルダーと関数を混在させている可能性が非常に高いですboos::lambda(おそらく、より多くのものboost::phoenixも同様です)。

これが修正されたデモです: Live On Coliru

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

struct X
{
    int x;
    std::string accessor() const { return "X[" + std::to_string(x) + "]"; } // I know, requires c++11
};

int main()
{
    std::vector<X> v;
    v.push_back({ 1 });
    v.push_back({2});
    v.push_back({3});
    v.push_back({4});
    v.push_back({5});

    std::for_each(v.begin(), v.end(), 
        std::cout << boost::lambda::bind(&X::accessor, boost::lambda::_1) << "\n");
}
于 2014-10-23T13:15:23.473 に答える