Конечно, вы можете просто написать свой собственный эквивалент boost :: mem_func. У TR1 тоже есть. Это немного повторяется, если вы хотите увеличить количество аргументов, но не концептуально сложно.
template<typename T, typename mem_func_type> struct mem_func_internal;
template<typename T, typename Ret> struct mem_func_internal<T, Ret (T::*)()> {
typedef Ret(T::* functype)();
T* obj;
functype func;
Ret operator()() {
return obj->*func();
}
};
template<typename T, typename Ret, typename ArgType1> struct mem_func_internal<T, Ret (T::*)(ArgType1) {
typedef Ret(T::* functype)();
T* obj;
functype func;
Ret operator()(ArgType1 arg) {
return obj->*func(arg);
}
}
template<typename T, typename mem_func_type> struct mem_func : public mem_func_internal<T, mem_func_type> {
mem_func(T* object, mem_func_type mem_func)
: obj(object)
, func(mem_func) {}
};
template<typename T, typename mem_func_type> mem_func<T, mem_func_type> bind_mem_func(T* object, mem_func_type func) {
return mem_func<T, mem_func_type>(object, func);
}
// Usage
std::for_each(wheel.begin(), wheel.end(), bind_mem_func(this, &Car::put));
Прошло много времени с тех пор, как я написал подобный код, так что, возможно, это будет немного не так. Но это суть этого. Так сложно написать пример использования без использования лямбды.