Mem_fun и bind1st проблема - PullRequest
       32

Mem_fun и bind1st проблема

2 голосов
/ 19 ноября 2009

У меня следующий класс:

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 - так что превращение каждого из них в функтор - слишком сложная задача.

Ответы [ 2 ]

12 голосов
/ 19 ноября 2009

Вам нужно использовать 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.

2 голосов
/ 19 ноября 2009

Если вы используете Boost.Bind, это может выглядеть так:

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