Ich möchte eine Funktionsvorlage schreiben, die auf einem Container mit Strings arbeitet, zum Beispiel einem std::vector
.
Ich möchte sowohl CString
als auch std::wstring
mit derselben Template-Funktion unterstützen.
Das Problem ist, dass CString
und wstring unterschiedliche Schnittstellen haben, um beispielsweise die "Länge" eines CString
zu erhalten, rufen Sie die GetLength()
-Methode auf, anstelle von wstring rufen Sie size()
oder length()
auf .
Wenn wir ein "statisches if" Feature in C ++ hätten, könnte ich etwas schreiben wie:
%Vor%Gibt es eine Vorlagenprogrammierungstechnik, um dieses Ziel mit den aktuell verfügbaren C ++ 11/14 Tools zu erreichen?
PS
Ich weiß, dass es möglich ist, ein paar DoSomething()
Überladungen mit vector<CString>
und vector<wstring>
zu schreiben, aber das ist nicht der Punkt der Frage.
Darüber hinaus möchte ich, dass diese Funktionsvorlage für jeden Container funktioniert, in dem Sie mit einer Range-for-Schleife iterieren können.
Hier ist einer mit einer hübschen Syntax.
Das Ziel ist es, die zusätzliche ()
s in @ Piotrs Lösung loszuwerden.
Viele Muster:
%Vor%So sieht es am Verwendungsort aus:
%Vor% mit einer unbegrenzten Kette von static_else_if
s wird unterstützt.
Es hindert Sie nicht daran, eine unbegrenzte Kette von static_else
zu erstellen ( static_else
im obigen Beispiel ist nur ein Alias für static_else_if<true>
).
Ein gängiger Weg, dies zu lösen, besteht darin, die erforderliche Schnittstelle in eine Merkmalklasse zu extrahieren. Etwas wie das:
%Vor%Natürlich können Sie dann noch etwas Besonderes machen und die Funktion selbst ändern, um zusätzlich zu der typbasierten Auswahl eine Merkmalsauswahl zu ermöglichen:
%Vor%Tags und Links c++ c++11 templates compile-time containers