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 - поэтому сделать каждого из них функтором - слишком сложная задача.
2 ответа
Вам нужно использовать 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
,
Если вы используете Boost.Bind, это может выглядеть так:
std::transform(
availableObjs.begin(), availableObjs.end(),
back_inserter(clonedObjs),
boost::bind<A*>(boost::mem_fn(&A::clone), _1, container) );