2010-11-14 6 views
11

Ich möchte einen Zeiger in C++ (oder in C++ 0x) schreiben, der auf einen Operator einer Klasse verweist, sagen wir A oder B. Gibt es eine Methode dafür?C++ Zeiger auf Operatoren

Natürlich gibt es eine Syntax wie

int (A::*_p)(); 

aber es dieses Problem nicht lösen. Ich möchte allgemeine Zeiger machen, nicht die Basisklasse für sie spezifiziert - nur für „Operatorfunktion“ Zeiger

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

Antwort

22

Nein, Sie können das nicht. Der Klassentyp ist ein Teil des Typs der Operatormemberfunktion. Der Typ A::operator()() unterscheidet sich vom Typ B::operator()(). Ersteres ist vom Typ int (A::*)(), während letzteres vom Typ int (B::*)() ist. Diese Typen sind völlig unabhängig voneinander.

Die nächstgelegene Sie bekommen können, ist durch so etwas wie der C++ 0x polymorphe Funktion Wrapper function (gefunden in C++ 0x, C++ TR1 und Boost) und unter Verwendung von bind mit den Member-Funktion Zeiger auf eine Klasse zu binden Beispiel:

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

Als Sie sehr viel! Genau das habe ich gesucht! :) –