2015-12-16 16 views
8

diese spezielle Containerklasse betrachten, die Typen, die beiden Schlüssel und Wert darin enthalten, soVorlage mit Standardwert von Methodenzeiger Argumente

template<typename K, typename T, K (T::*method)() const> 
class Container 
{ 
//... 
}; 

K ist die Art eines Schlüssels speichert, ist T eine Art von Wert und der Methodenzeiger wird verwendet, um den Schlüssel von dem Wert abzurufen.

Es funktioniert gut, aber ich würde einen Standard für die Methode Zeiger enthalten mögen, so dass, wenn es nicht vom Anrufer angegeben wurde es operator K() const wie so wäre:

template<typename K, typename T, K (T::*method)() const = &T::operator K const> 

aber nicht kompiliert dort unter Angabe ist no member operator const K on A (<- my class I test this with), wenn ich versuche, es zu instanziieren (und es gibt so eine Methode). Ist es sogar möglich, den Standardwert eines Methodenzeiger-Template-Arguments zu haben? Wenn ja, wie lautet die korrekte Syntax?

EDIT: Neben der Lösung unten gibt es einen „Fix“ für die Fälle, wenn T ein Zeiger ist, die neue C std::remove_pointer<T>::type ++ 11-Funktion verwendet, so:

template<typename K, typename T, K (std::remove_pointer<T>::type::*method)() const = &std::remove_pointer<T>::type::operator K> 
+1

Die Idee ist [Sound im Prinzip] (http://ideone.com/fgtF5y). Es kann nur eine Frage der korrekten Schreibweise des Namens der bestimmten Funktion (der Konvertierungsfunktion) sein. –

+2

[There] (http://ideone.com/k1bCEJ), vielleicht entfernen Sie die 'const'? –

+1

'Operator K const' (==' Operator const K') wäre eine Konvertierungsfunktion zu, nun, 'const K'. –

Antwort

5

Der Name der Funktion ist nur operator K. Seine Qualifikation ist nicht Teil des Namens. Versuchen Sie:

template <typename K, 
      typename T, 
      K (T::*method)() const = &T::operator K> 
//         ^^^^^^^^^^^^^^ 
+2

Guter Punkt: Der Name des Mitglieds * bezieht * die Qualifier (oder die Argumente) nicht ein. Wenn es notwendig ist, eine Überlastung aufzulösen, muss dies über die Umwandlung in einen geeigneten Mitgliedszeiger erfolgen (was in diesem Fall bequemerweise leicht verfügbar ist). –

+0

Richtig, natürlich. Jetzt funktioniert es, außer wenn ich Zeiger auf T als Argument verwende. Ich denke, Spezialisierung sollte dabei helfen. – Resurrection

+0

Und ich habe es für Fälle herausgefunden, in denen T auch ein Zeiger ist. Als Bearbeitung zum OP hinzugefügt. – Resurrection