Чего вы пытаетесь достичь с помощью bind1st?
Функция bind1st
берет двоичную функцию и адаптирует ее к унарной функции, делая первый аргумент неявным (это может быть не лучшим описанием, извините).Возвращаемое значение mem_fun
является унарной функцией.
Функция mem_fun
возвращает адаптер для функции-члена.Адаптированная функция не принимает никаких аргументов, хотя возвращаемый адаптер принимает один аргумент - указатель на объект MyClass, который будет использоваться.
Так что, в основном, ваш вызов mem_fun
возвращает адаптер, который принимает одинаргумент, но bind1st
ожидает адаптер, который принимает два аргумента.Существует mem_fun1
, который возвращает адаптер, который принимает два аргумента, первый - указатель объекта, а второй - аргумент функции, но это не то, что вам нужно.
На самом деле,Я не совсем понимаю, что вы пытаетесь сделать;почему простая mem_fun
версия не подходит?Если вам нужно, чтобы указатель объекта был «присоединен» к адаптеру, я не думаю, что вы можете сделать это с текущей стандартной библиотекой, если только вы не используете bind.
Конечно, вы можете создать класс-оболочкукоторый содержит указатель на объект, а затем просто определите operator () для вызова адаптера с этим объектом.
// Quick and dirty example of this.
// You could extend this with a second template parameter for return type, if
// needed. Just be sure to specialize for void if you do that.
template<typename Object>
struct bound_mem_fun_t {
bound_mem_fun_t(mem_fun_t<void, Object> f, Object* o) : fun(f), obj(o) { }
void operator()() { fun(obj); }
mem_fun_t<void, Object> fun;
Object* obj;
};
MyClass a;
bound_mem_fun_t<MyClass> func(mem_fun(&MyClass::Bar), &a);
func();