2010-11-14 16 views
11

Voglio scrivere un puntatore in C++ (o in C++ 0x), che punta a un operatore di una classe, diciamo A o B. C'è qualche metodo per farlo?C++ puntatori agli operatori

Naturalmente v'è una sintassi simile

int (A::*_p)(); 

ma non risolve questo problema. Voglio fare puntatore generale, non specificando la classe base per esso - puntatore solo per "funzione di operatore"

#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(); 
} 

risposta

22

No, non si può fare questo. Il tipo di classe è una parte del tipo di funzione membro dell'operatore.

Il tipo di A::operator()() è diverso dal tipo di B::operator()(). Il primo è di tipo int (A::*)() mentre il secondo è di tipo int (B::*)(). Questi tipi sono del tutto estranei.

Il più vicino si può ottenere è quello di utilizzare qualcosa come la funzione polimorfica C++ 0x involucro function (che si trova in C++ 0x, C++ TR1 e Boost) e utilizzando bind per legare il puntatore a funzione membro a una classe istanza:

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

Grazie mille! questo è esattamente quello che stavo cercando! :) –