Ich möchte eine Liste von Manipulatoren an eine Funktion übergeben, etwa so:
%Vor%was im Idealfall durch Code wie folgt aufgerufen würde:
%Vor%g ++ 4.7.0 sagt:
%Vor% Anscheinend ist smanip
im Standard nicht wirklich definiert, und C ++ 11-Compiler müssen keinen expliziten Namen für den Typ der Manipulatoren angeben. Ich habe versucht, einen Typ zu deklarieren, indem ich einen bekannten Manipulator weglecke:
Dies hat eine Menge neuer Fehlermeldungen geöffnet, einschließlich dieser:
%Vor%Sollte ich jetzt einfach aufgeben, oder gibt es eine Möglichkeit, dies zu tun?
Ein Ausgabemanipulator ist einfach ein beliebiger Typ, für den os << m
für einige basic_ostream
Instanziierung definiert ist. Ein Manipulator kann eine Funktion sein (abhängig von den operator<<
Überladungen von basic_ostream
), aber es kann auch ein beliebiger Typ sein, der seine eigene operator<<
definiert. Daher müssen wir das Löschen des Typs durchführen, um die operator<<
für eine geeignete basic_ostream
Instanziierung einzufangen; Am einfachsten ist dies mit std::function
und einem Lambda:
Ihre Manipulatoren können so ziemlich beliebige Typen haben, also müssen Sie Vorlagen verwenden, um sie zu handhaben. Um auf sie mit einem Zeiger oder einer Referenz des festen Typs zuzugreifen, müssen Sie eine gemeinsame Basisklasse für alle diese Vorlagen verwenden. Diese Art von Polymorphie funktioniert nur für Zeiger und Referenzen, aber Sie möchten wahrscheinlich Wert Semantik, insbesondere für die Speicherung in Contains. Der einfachste Weg ist also, ein shared_ptr
die Speicherverwaltung zu übernehmen und eine andere Klasse zu verwenden, um alle hässlichen Details vor dem Benutzer zu verbergen.
Das Ergebnis könnte so aussehen:
%Vor%Damit funktioniert Ihr Code nach einigen kleinen Änderungen an Namespaces:
%Vor%