如何从成员函数中创建函子?

问题描述:

我想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; 
} 

这并不编译和错误信息并不能帮助我:

在f():
敌不过呼叫“(标准:: binder1st <的std :: mem_fun_t <无效,租车> >)()”

在通话时同时运行:
没有键入n艾湄“first_argument_type”在“类的std :: mem_fun_t <无效,租车>”
没有类型在一个名为“second_argument_type“类的std :: mem_fun_t <无效,租车>”

没有提振请。

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

+0

你是否愿意让从TR1和/或C++ 0x绑定(以及)? – 2011-02-12 23:56:23

+0

是的,我绝对有兴趣,所以请发布!但是,我需要纯粹的C++ 03的最终解决方案。 – Ali 2011-02-13 00:00:09

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; 
} 

升压/ TR1/C++ 0x中的解决方案是非常简单:

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

的的C++ 0x的解决方案使用lambda表达式 - 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; 
}