Implementieren einer "static-if" -Konfigurationslogik für verschiedene String-Typen in einem Container

7

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.

    
Mr.C64 03.06.2016, 15:00
quelle

5 Antworten

16
%Vor%

Test:

%Vor%

DEMO

    
Piotr Skotnicki 03.06.2016, 15:11
quelle
5

Sie könnten Funktionsüberladungen bereitstellen, die das tun, was Sie brauchen:

%Vor%     
Smeeheey 03.06.2016 15:07
quelle
4

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> ).

    
Yakk 03.06.2016 17:42
quelle
4

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%     
Angew 03.06.2016 15:08
quelle
3

Sie können zwei Überladungen angeben, um die Länge zu erhalten:

%Vor%     
101010 03.06.2016 15:07
quelle