如何从成员函数中创建一个仿函数?

时间:2011-02-12 23:47:19

标签: c++ templates stl functor

我希望run致电c.drive()

#include <functional>
using namespace std;

struct Car {
    void drive() { }
};

template <typename Function>
void run(Function f) {
    f();
}

int main() {
    Car c;    
    run(bind1st(mem_fun(&Car::drive), &c));    
    return 0;
}

这不编译,错误消息对我没有帮助:

at f():
没有匹配调用'(std :: binder1st&lt; std :: mem_fun_t&lt; void,Car&gt;&gt;)()'

致电运行:
'class std :: mem_fun_t&lt; void,Car&gt;'中没有名为'first_argument_type'的类型 'class std :: mem_fun_t&lt; void,Car&gt;'

中没有名为'second_argument_type'的类型

请不要加强。

更新:即使问题解决了,我也很高兴看到TR1 / C ++ 0x解决方案!

3 个答案:

答案 0 :(得分:9)

Boost / TR1 / C ++ 0x解决方案非常简单:

run(std::bind(&Car::drive, &c));

答案 1 :(得分:7)

bind1st使用二元函数和值生成一元函数。您正在尝试创建一个不使用一元函数的参数的函数,并且在标准C ++ 03中没有任何支持它的功能。

你必须做这样的事情。

template<class X, void (X::*p)()>
class MyFunctor
{
    X& _x;
public:
    MyFunctor(X& x) : _x( x ) {}
    void operator()() const { (_x.*p)(); }
};

template <typename Function>
void run(Function f) {
    f();
}

int main() {
    Car c;
    run(MyFunctor<Car, &Car::drive>(c));
    return 0;
}

答案 2 :(得分:6)

使用lambdas的C ++ 0x解决方案 - http://www.ideone.com/jz5B1

struct Car {
    void drive() { }
};

template <typename Function>
void run(Function f) {
    f();
}

int main() {
    Car c;    
    run( [&c](){ c.drive(); } );    
    return 0;
}