C ++: Ponteiro para versão monomórfica da função de membro virtual?
No C ++, é possível obter um ponteiro para uma função de membro (não estática) de uma classe e depois invocá-lo em um objeto. Se a função era virtual, a chamada é despachada dinamicamente, dependendo do tipo dinâmico do objeto. Também é possível (sem usar um ponteiro de membro) chamar funções de membro virtual de objetos monomorficamente, fornecendo explicitamente o escopo que contém a versão a ser usada. O código a seguir demonstra isso:
#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
}
O que eu gostaria de fazer é combinar os dois e obter um ponteiro para a versão monomórfica de uma função de membro; ou seja, quero um ponteiro para Foo :: foo, que sempre chama a versão de classe base de foo e imprime 1, mesmo que seja invocado em um Foo2. No entanto, não consegui encontrar uma maneira de fazer isso. É possível?
(Além da tediosa maneira manual de escrever uma nova função não virtual que faz a chamada monomórfica e, em seguida, obter um ponteiro para isso.)