4

紛らわしいタイトルです。うまくいけば、いくつかのコードが明確になります。

struct MyNestedType {
    void func();
};

struct MyType {
    MyNestedType* nested;
}

std::vector<MyType> vec;

// ... populate vec

// I want something approximating this line, but that doesn't use made-up C++!
std::for_each(vec.begin(), vec.end(), std::mem_fun_ref(&MyType::nested->func));

したがって、基本的にはコンテナの各要素でメソッドを呼び出したいのですが、実際にはその型のメソッドではなく、含まれている型のメソッドです...関数オブジェクトを記述して呼び出しを「渡す」ことができることを知っていますしかし、私が呼び出したいいくつかのメソッドがあり、それは面倒です。

何か案は?

4

6 に答える 6

6

単純な for ループを使用してみませんか?

for(vector<MyType>::iterator i = vec.begin(); i != vec.end(); ++i)
    i->nested->func();

または、ラムダ式またはboost::foreachを使用できます

FOREACH(MyType x, vec)
    x.nested->func();

バインダーと mem_funs を使用して式を構築できますが、これは非常に面倒で混乱を招きます。すべてを 1 つの std::foreach 行に入れる利点はありません。

于 2009-05-13T13:14:24.593 に答える
3

そのようなファンクターを使用できます

template <typename T, T* MyType::* TMember, void (T::* TNestedMember)() >
struct Caller {
    Caller() {
    }

    template <typename TObject>
    void operator()(TObject object) {
        (object.*TMember->*TNestedMember)();
    }
};

問題を解決するには

struct MyNestedType {
    MyNestedType(int a):
        a_(a){
    }
    void func() {
        std::cout << "MyNestedType::func " << a_ << std::endl;
    }
    void foo() {
        std::cout << "MyNestedType::foo " << a_ << std::endl;
    }
    int a_;
};
struct MyType {
    MyNestedType* nested;
};

int main()
{
    std::vector<MyType> vec;

    std::auto_ptr<MyNestedType> nt1(new MyNestedType(2));
    std::auto_ptr<MyNestedType> nt2(new MyNestedType(5));
    MyType t1 = {nt1.get()};
    MyType t2 = {nt2.get()};

    vec.push_back(t1);
    vec.push_back(t2);

    std::for_each(vec.begin(), vec.end(), 
                  Caller<MyNestedType, &MyType::nested, &MyNestedType::func>());
    std::for_each(vec.begin(), vec.end(), 
                  Caller<MyNestedType, &MyType::nested, &MyNestedType::foo>());
}
于 2009-05-13T13:43:53.703 に答える
2

for_each を使用する場合は、ファンクターが必要です。

struct CallMyFunc
{
    void operator()(MyType& obj)    {   obj.nested->func();}
};


std::for_each(vec.begin(), vec.end(), CallMyFunc());

または、次のように説明されている boost::FOREACH 構文を使用します。

Dario:コンテナーの要素のメンバーのメンバー関数を for_each で呼び出す?

于 2009-05-13T13:39:10.480 に答える
2

はいboost::bind、これに使用することは可能ですが、面倒です。@Dario のブースト for-each を使用してくださいboost::bind

std::for_each(vec.begin(), vec.end(), 
    boost::bind(&MyNestedType::func, boost::bind(&MyType::nested, _1)));

とにかく、たまたま、これで素敵なワンライナーさえ得られません:)

于 2009-05-13T14:38:46.920 に答える
2

たぶん、func() を構造体 MyType() に追加できます。

void func(...) {
   nested->func(...);
}

この方法では、個別のアダプター ファンクターを持たず、代わりにラッパー タイプ内の集約、つまり非常に通常の OOP 手法を使用できます。

于 2009-05-13T13:25:47.460 に答える
0

ブーストの使用はどうtransform_iteratorですか?

于 2009-05-13T13:08:42.120 に答える