下面的“解决方案”编译,但它不是我想要的。我想将put
成员函数传递给for_each
而不是*this
。使用boost是 NOT 一个选项。这可以在C ++ 03中解决吗?
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
class Wheel { };
class Car {
public:
void process(const vector<Wheel>& wheel) {
for_each(wheel.begin(), wheel.end(), *this);
}
void operator()(const Wheel& w) { put(w); }
private:
void put(const Wheel& w) { }
};
int main() {
vector<Wheel> w(4);
Car c;
c.process(w);
return 0;
}
答案 0 :(得分:12)
是的,可以使用mem_fun
和bind1st
模板的组合:
void process(const vector<Wheel>& wheel) {
for_each(wheel.begin(), wheel.end(), bind1st(mem_fun(&Car::put), this));
}
对mem_fun
的调用会创建一个新的函数对象,它接受两个参数 - Car*
作为接收者和Wheel
,然后调用put
第一个参数作为接收者,第二个参数作为参数。调用bind1st
然后锁定接收器对象作为此函数的第一个参数。
但是,我认为您需要对此代码进行一处小改动才能使其正常工作。 bind1st
适配器与通过const引用获取其参数的函数不兼容,因此可能需要更改put
以便它需要Wheel
按价值而不是参考。
答案 1 :(得分:3)
您可以使用mem_fun_ref:请参阅here。
mem_fun_ref
应该适用于您拥有对象矢量的情况:
for_each(wheel.begin(), wheel.end(), mem_fun_ref(&Wheel::put));
请注意,上面的示例将put
更改为Wheel而非Car的成员。它应该让你知道如何使用它。
如果你有一个指向对象的指针向量
,请使用mem_fun
答案 2 :(得分:1)
当然 - 您可以编写自己的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的情况下编写一个用法示例。