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.
Unter der Annahme, dass nur bestimmte Spezialisierungen von Common
Aliase von TypeZ
sind, können Sie Folgendes tun:
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.
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 :
Beide Implementierungen sind äquivalent zu einem Namen und der Tatsache, dass Sie einen Funktionsaufrufoperator ()
oder den Mitgliedaccessor ::value
in std::conditional
verwenden müssen.