在C ++ 03中将成员函数传递给for_each(没有提升,没有c ++ 11)

时间:2011-01-09 23:16:23

标签: c++ stl c++03

下面的“解决方案”编译,但它不是我想要的。我想将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;
}

3 个答案:

答案 0 :(得分:12)

是的,可以使用mem_funbind1st模板的组合:

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的情况下编写一个用法示例。