如何从成员函数中创建函子?
问题描述:
我想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解决方案!
答
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;
}
你是否愿意让从TR1和/或C++ 0x绑定(以及)? – 2011-02-12 23:56:23
是的,我绝对有兴趣,所以请发布!但是,我需要纯粹的C++ 03的最终解决方案。 – Ali 2011-02-13 00:00:09