Wenn eine Vorlage vollständig spezialisiert ist, muss eine Elementfunktion nicht dupliziert werden. Im folgenden Code wird beispielsweise foo()
nur einmal geschrieben.
Für eine teilweise Spezialisierung ist es jedoch notwendig, die Klassendefinition und alle Mitgliedsfunktionen zu duplizieren. Zum Beispiel:
%Vor% Beachten Sie, dass A<2, N>::foo()
ein Duplikat von A<M, N>::foo()
mit 2 für M
manuell ersetzt wurde.
Wie kann eine solche Codeverdopplung in diesem Kontext der partiellen Spezialisierung der Vorlage vermieden werden?
In diesem Fall würde ich eine Basisklasse dazu bringen, den Template-Parameter 'N' nicht zu kennen:
%Vor%Alternativ könnten Sie die gesamte Basisklasse spezialisieren.
Obligatorische Antwort mit Tag-Versand:
Sie können eine überladene Hilfsfunktion erstellen; eine, die im Fall M == 2
aufgerufen wird, und die andere, wenn M != 2
. Auf diese Weise können Sie das Erstellen einer Vorlagenbasisklasse vermeiden. Alles, was wir tun müssen, ist, die Bedingung M == 2
in einen Typ umzuwandeln, den wir mit std::true_type
und std::false_type
von <type_traits>
Um die Übersetzung in einen Typ durchzuführen (Kompilierzeitprüfung):
%Vor%Und Sie können sie so nennen:
%Vor% Wenn Sie vermeiden möchten, ein Konzept zu erstellen, können Sie stattdessen std::integral_constant
, aber Sie werden einige Kompilierzeit-Template Bloat bekommen ( Siehe Antwort von Jarod42 hier ):
Danke an alle, die Antworten gegeben haben.
Folgen Sie dem Link von Vaughn Cato und führen Sie einen weiteren Link zu diese Lösung, die std::enable_if
anstelle der Template-Teilspezialisierung verwendet.
Die Implementierung für das vorliegende Problem ergibt:
%Vor%Tags und Links c++ templates partial-specialization