Können Sie einen Manipulator an eine Funktion übergeben?

8

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:

%Vor%

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?

    
Ben Kovitz 05.02.2013, 07:58
quelle

3 Antworten

5

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:

%Vor%     
ecatmur 05.02.2013, 09:28
quelle
6

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%     
MvG 05.02.2013 09:09
quelle
1

Da die Manipulatoren Funktionen sind, kommt es auf ihre Signatur an. Das heißt, Sie können Vektor von Manipulatoren mit der gleichen Signatur erstellen.

Zum Beispiel:

%Vor%

Die Alternative ist die Verwendung von lambdas:

%Vor%     
BЈовић 05.02.2013 08:31
quelle

Tags und Links