0

マップ内にオブジェクト ポインターのコレクションがあり、いくつかの場所でコレクションを反復処理し、各オブジェクトのメンバー関数を呼び出す必要があります。

現時点では、コレクション内のすべての要素で呼び出す必要があるメンバー関数ごとに、関連するメンバーを呼び出すコレクションを反復処理するプロキシ関数を追加しています。

ブーストを使用して、一般的なケースでこれを処理するコレクション クラスでテンプレート関数を作成できるかどうか疑問に思っていますか?

回答: これは非常に簡単であることがわかりました。元の例を変更して、希望どおりに機能するようにしました。

class Object
{
public:
    void func1();
    void func2(int a);
};

class ObjectCollection : public std::map<std::string, Object*>
{
public:
    template <typename Func>
    void invokeMember(Func func)
    {
        for (iterator it = begin(); it != end(); ++it)
        {
            it->second->func();
        }
    }
};

void test()
{
    ObjectCollection collection;
    // ...
    collection.invokeMember(boost::bind(&Object::func1, _1));
    collection.invokeMember(boost::bind(&Object::func2, _1, 42));
}
4

1 に答える 1

0

これはあなたがやろうとしていることですか:

boost::bind(&X::f, ref(x), _1)(i);      // x.f(i)

ここから撮影

さまざまなパラメーターを持つさまざまな関数が必要な場合は、関数 (invokeMember に渡す) を識別する列挙型を使用し、invokeMember に可変数のパラメーターを渡し、そこで bind を呼び出すことができます。

可変数のパラメーターよりも、可能なすべてのパラメーターを含むクラスを使用する方が良い場合があります (またはvoid *、その関数呼び出しのパラメーターを定義するクラスを指す を渡し、動的キャストを使用します)。

于 2012-11-29T07:23:47.707 に答える