Мой вопрос об использовании методов std :: function для класса. Предположим, у меня есть следующие иерархии классов:Использование std :: function для memberfunctions
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);
Когда я компилирую приведенный выше код фрагмент кода с помощью г ++/лязг ++, он работает, как и ожидалось, где выход:
In Foo::print()
In Bar::print()
Мои вопросы, то:
, так как есть две функции (перегруженные) с тем же именем: печать, когда я передать адрес функции класса:
&Foo::print
, как же компилятор знает, что я на самом деле вызоваFoo::print(void)
но неFoo::print(int)
?есть другой способ, что я могу обобщить код, указанный выше, так что второй параметр
void call(Foo*, xxx)
может быть передан с использованием какFoo::print(void)
иFoo::print(int)
есть в любом случае для достижения этой функции с помощью новой функции в C++ 11
std::function
? Я понимаю, что для использования методаstd::function
с использованием метода нестатического класса я должен использоватьstd::bind
для привязки каждого метода класса к определенному объекту класса, но это было бы слишком неэффективно для меня, потому что у меня есть много объектов класса, которые будут связаны.
Вы сказали, что в прототипе 'вызова (Foo * Foo, аннулируются (Foo :: * FUNC) (аннулируются))', таким образом, вы будете get '(void)' перегрузка –
@SeverinPappadeux это правильно.Но когда я передаю '& Foo :: print' при передаче аргумента, как компилятор решил, что передать? –