我希望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;'
请不要加强。
更新:即使问题解决了,我也很高兴看到TR1 / C ++ 0x解决方案!
答案 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;
}