2010-11-14 18 views
11

Quiero escribir un puntero en C++ (o en C++ 0x), que apunta a un operador de una clase digamos A o B. ¿Hay algún método para hacerlo?punteros C++ a operadores

Por supuesto que es una sintaxis como

int (A::*_p)(); 

pero no resuelve este problema. Quiero hacer puntero en general, no se especifica la clase base para que - solamente puntero para "función de operador"

#include <thread> 
#include <iostream> 

using namespace std; 

class A 
{ 
public: 
    int operator()() 
    { 
     return 10; 
    } 
}; 

class B 
{ 
public: 
    int operator()() 
    { 
     return 11; 
    } 
}; 

int main() 
{ 
A a; 
int (*_p)(); 
_p = a.operator(); 
cout << _p(); 

B b; 
_p = b.operator(); 
cout << _p(); 
} 

Respuesta

22

No, no se puede hacer esto. El tipo de clase es una parte del tipo de la función de miembro operador.

El tipo de A::operator()() es diferente del tipo de B::operator()(). El primero es del tipo int (A::*)() mientras que el último es del tipo int (B::*)(). Esos tipos no tienen ninguna relación.

Lo más cerca que se puede conseguir es mediante el uso de algo así como el C++ 0x función polimórfica envoltorio function (que se encuentra en C++ 0x, C++ TR1 y la Boost) y mediante el uso bind para unir el puntero de función miembro de una clase instancia:

std::function<int()> _p; 

A a; 
_p = std::bind(&A::operator(), a); 
std::cout << _p(); 

B b; 
_p = std::bind(&B::operator(), b); 
std::cout << _p(); 
+0

¡Muchísimas gracias! eso es exactamente lo que estaba buscando! :) –