2016-04-22 13 views
0

Ich fand einige nette Eigenschaft Vorlagen here.Template-Funktion der Template-Klasse mit Funktionszeigern

Diese erlauben mich so eine Zeichenfolge-Eigenschaft für einen Namen zu machen:

class Entity { 
    const std::string& get_name() const; 
    const std::string& set_name(const std::string& name); 
public: 
    UnrestrictedProperty<std::string, Entity, &Entity::get_name, &Entity::set_name> name; 
    ... 
} 

diese Vorlage verwenden:

template <class Type, class Object, const Type&(Object::*real_getter)() const, const Type&(Object::*real_setter)(const Type&)> 
class UnrestrictedProperty { ... } 

Jetzt würde ich die < < Betreiber überlasten gerne, aber ich kann nicht herausfinden, wie man eine Template-Vorlage erstellt, wenn Funktionszeiger beteiligt sind.

Antwort

0

Eine Lösung kann eine nicht-Memberfunktion so sein deklarieren:

template <class Type, class Object, const Type&(Object::*real_getter)() const, const Type&(Object::*real_setter)(const Type&)> 
std::ostream& operator<<(std::ostream& output, const UnrestrictedProperty<Type, Object, real_getter, real_setter> unrestricted_property) { 
    return (output << unrestricted_property.get()); 
} 

Bitte beachten Sie, dass hier keine Notwendigkeit des Keyword-Freund ist, weil wir get() Methode verwenden, die eine öffentliche Funktion Mitglied ist.

Darüber hinaus ist es normalerweise besser, komplexe Objekte wie std::string per const-Referenz zurückzugeben und eine Kopie zu vermeiden. Ich wollte hinzufügen, dass eine Methode, die das Objekt nicht ändert, auch const sein muss, ich spreche über get_name hier.

+0

Danke, Sie. (Ich verbesserte die Frage.) – Tenjix

Verwandte Themen