【发布时间】:2015-05-08 18:45:58
【问题描述】:
我的问题是关于使用 std::function 对方法进行分类。假设我有以下类层次结构:
class Foo {
public:
virtual void print() {
cout << "In Foo::print()" << endl;
}
virtual void print(int) {
cout << "In Foo::print(int)" << endl;
}
};
class Bar : public Foo {
public:
virtual void print() override {
cout << "In Bar::print()" << endl;
}
virtual void print(int) override {
cout << "In Bar::print(int)" << endl;
}
}
现在有另一个函数应该根据其输入动态调用两个类方法之一:
void call(Foo* foo, void (Foo::*func)(void)) {
(foo->*func)();
}
Foo* foo = new Foo();
Bar* bar = new Bar();
call(foo, &Foo::print);
call(bar, &Foo::print);
当我使用 g++/clang++ 编译上述代码 sn-p 时,它按预期工作,输出为:
In Foo::print()
In Bar::print()
我的问题是:
既然有两个函数(重载)同名:print,当我传递类函数的地址时:
&Foo::print,编译器怎么知道我实际上调用的是Foo::print(void)而不是@ 987654326@?有没有另一种方法可以概括上面的代码,这样
void call(Foo*, xxx)的第二个参数可以同时使用Foo::print(void)和Foo::print(int)来传递是否有使用 C++11 中的新功能
std::function来实现此功能?我知道为了将std::function与非静态类方法一起使用,我必须使用std::bind将每个类方法与特定的类对象绑定,但这对我来说效率太低,因为我有很多类对象被绑定。
【问题讨论】:
-
你在原型中说过
call(Foo* foo, void (Foo::*func)(void)),因此你会得到(void)重载 -
@SeverinPappadeux 没错。但是当我在传递参数时给
&Foo::print时,编译器是如何决定要传递哪个的?
标签: c++ c++11 c++-standard-library std-function member-functions