2012-11-29 61 views
0

我有一個地圖集合中的對象指針,在幾個地方我需要遍歷集合並調用每個對象的成員函數。使用boost的集合中的成員函數代理

在我需要調用集合中的每個元素的每個成員函數的時刻,我添加了一個代理函數,它對調用關聯成員的集合進行迭代。

我想知道是否有可能使用boost來創建集合類中的模板函數,它將爲我在通用情況下處理這個問題?

答案:原來,這是很容易的,修改了我原來的例子,以便它可以作爲期望:

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)); 
} 

回答

0

這是你想要做什麼:

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

採取從here

如果你想有不同的功能與不同的參數,你可以有一個枚舉來識別函數(你傳遞給invokeMember),通過一個變量調用成員的參數個數,並在那裏調用綁定。

而不是可變數量的參數,最好有一個包含所有可能參數的類(或者傳遞一個指向定義該函數調用參數的類的void *並使用動態轉換)。

+0

感謝您的回覆 - 我會嘗試一下,看看我能得到它。 – Derek

+0

原來它非常簡單,它的工作原理與我想要的完全一樣,我只需要將_1佔位符添加到我的綁定中即可。 – Derek

相關問題