Ist es möglich, eine Implementierungsschablonenspezialisierung als typedef eines anderen Typs zu definieren?

8

Ich habe eine Klassenvorlage, für die ich mehrere Vorlagenspezialisierungen einführen möchte. Diese Vorlagenspezialisierungen sind mit einem vorhandenen Typ identisch. Konzeptionell möchte ich sie als Alias ​​/ typedefs implementieren.

Der folgende Beispielcode sollte zeigen, was ich tun möchte:

%Vor%

Ist das obige in irgendeiner Weise in C ++ (oder C ++ 11) möglich? Es wäre großartig, wenn ich Common<...> nicht als eine Klasse implementieren müsste, die TypeZ erbt - der tatsächliche Code ist komplexer als oben gezeigt und das Erben von TypeZ ist dort keine gute Idee.

    
p12 06.12.2013, 09:01
quelle

2 Antworten

9

Unter der Annahme, dass nur bestimmte Spezialisierungen von Common Aliase von TypeZ sind, können Sie Folgendes tun:

%Vor%

Dann verwenden Sie common_t<T> anstatt Common<T> .

Nur um die Vererbungsidee zu unterhalten, haben Sie das versucht?

%Vor%

Dann müssen Sie keinen verschachtelten Alias ​​verwenden.

    
Simple 06.12.2013, 09:09
quelle
3

Ja, Sie können mit Aliasnamen eingeben:

%Vor%

Siehe den Link für weitere Beispiele, was möglich ist. using kann überall verwendet werden, wo typedef verwendet werden kann, plus in Template-Aliasen wie oben, also empfehle ich using über typedef überall dort, wo Sie C ++ 11 schreiben.

Wenn Sie ein komplizierteres Mapping benötigen, können Sie eine einfache Metaprogrammierung der Vorlage verwenden, indem Sie std::enable_if verwenden oder std::conditional kombiniert mit std::is_same . Wenn Sie beispielsweise nur für drei Typen spezialisieren möchten, verwenden Sie das :

%Vor%

Beide Implementierungen sind äquivalent zu einem Namen und der Tatsache, dass Sie einen Funktionsaufrufoperator () oder den Mitgliedaccessor ::value in std::conditional verwenden müssen.

    
rubenvb 06.12.2013 09:05
quelle

Tags und Links