2009-11-19 43 views
2

我下面的類:mem_fun和bind1st問題

class A { 
public: 
// ctr and etc ... 
A* clone(B* container); 
}; 

現在,我已經填充的vector<A*> availableObjs。我想對其中的每一個調用clone,因此將克隆的對象插入到類型爲vector<A*>的新容器clonedObjs中。我試圖追蹤 - 但它不能編譯:

transform(availableObjs.begin(), availableObjs.end(), back_inserter(clonedObjs), 
    bind1st(mem_fun(&A::clone), container)); // container is of type B* 

有沒有簡單的方法?我有很多類似於A的東西 - 所以把它們當作一個函數是太多的任務。

+0

你確定你想在你的容器指針?您不得在該算法上調用任何修改算法(例如排序)。但是,您可以使用shared_ptr 的向量,然後再次支持值語義。 – fmuecke

回答

12

您需要使用bind2nd而不是bind1st

transform(availableObjs.begin(), availableObjs.end(), back_inserter(clonedObjs), 
    bind2nd(mem_fun(&A::clone), container)); // container is of type B* 

通過mem_fun(&A::clone)創建的仿函數期待一個A*作爲第一個參數。這是調用該方法的通常隱式指定的實例。 A::clone的第一個「真實」參數是mem_fun(&A::clone)的第二個參數,因此需要與bind2nd綁定。

+0

謝謝 - 它工作:) – soumeng78

2

如果使用Boost.Bind它可能是這樣的:

std::transform(
       availableObjs.begin(), availableObjs.end(), 
       back_inserter(clonedObjs), 
       boost::bind<A*>(boost::mem_fn(&A::clone), _1, container));