2009-11-19 2 views
2

я следующий класс:mem_fun и bind1st проблема

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

Теперь, у меня есть vector<A*> availableObjs заселен уже. Я хочу позвонить clone по каждому из них, поэтому и вставить клонированные объекты в новый контейнер clonedObjs типа vector<A*>. Я стараюсь следовать - но он не компилируется:

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)); 
Смежные вопросы