当然——你可以写你自己的 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));
自从我写这样的代码以来已经有一段时间了,所以它可能有点不对劲。但这就是它的要点。如果不使用 lambda,很难编写一个使用示例。