Template Teilspezialisierung: Wie kann Codeduplikation vermieden werden?

8

Wenn eine Vorlage vollständig spezialisiert ist, muss eine Elementfunktion nicht dupliziert werden. Im folgenden Code wird beispielsweise foo() nur einmal geschrieben.

%Vor%

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?

    
Gidfiddle 25.01.2016, 17:21
quelle

4 Antworten

2

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.

    
Dieter Lücking 25.01.2016 17:50
quelle
1

Sie könnten header in eine separate Klasse verschieben und diese nur teilweise spezialisieren:

%Vor%

Ausgabe

%Vor%

Live-Beispiel

    
m.s. 25.01.2016 17:29
quelle
1

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>

machen %Vor%

Um die Übersetzung in einen Typ durchzuführen (Kompilierzeitprüfung):

%Vor%

Und Sie können sie so nennen:

%Vor%

Demo

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

%Vor%

Demo 2

    
AndyG 25.01.2016 19:50
quelle
0

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%     
Gidfiddle 25.01.2016 20:07
quelle