マップ内にオブジェクト ポインターのコレクションがあり、いくつかの場所でコレクションを反復処理し、各オブジェクトのメンバー関数を呼び出す必要があります。
現時点では、コレクション内のすべての要素で呼び出す必要があるメンバー関数ごとに、関連するメンバーを呼び出すコレクションを反復処理するプロキシ関数を追加しています。
ブーストを使用して、一般的なケースでこれを処理するコレクション クラスでテンプレート関数を作成できるかどうか疑問に思っていますか?
回答: これは非常に簡単であることがわかりました。元の例を変更して、希望どおりに機能するようにしました。
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));
}