В C ++ можно получить указатель на (нестатическую) функцию-член класса, а затем вызвать его для объекта. Если функция была виртуальной, вызов отправляется динамически в зависимости от динамического типа объекта. Также возможно (без использования указателя на член) мономорфно вызывать виртуальные функции-члены объектов, явно предоставляя область, содержащую версию для использования. Следующий код демонстрирует это:
#include <iostream>
using std::cout; using std::endl;
struct Foo
{
virtual void foo() { cout << 1 << endl; }
};
struct Foo2: public Foo
{
virtual void foo() { cout << 2 << endl; }
};
int main( int, char** )
{
Foo *foo = new Foo2;
void (Foo::*foo_pointer)() = &Foo::foo;
foo->foo(); // prints 2
foo->Foo::foo(); // prints 1
(foo->*foo_pointer)(); // prints 2
}
Я хотел бы объединить их и получить указатель на мономорфную версию функции-члена; т.е. мне нужен указатель на Foo :: foo, который всегда вызывает версию foo базового класса и печатает 1, даже если он вызывается в Foo2. Однако мне не удалось найти способ сделать это. Является ли это возможным?
(За исключением утомительного ручного способа написания новой невиртуальной функции, которая выполняет мономорфный вызов, а затем получает указатель на это.)
std::function
для этого? GCC и VC10 поддерживают их. - person sbi   schedule 21.02.2011