C ++ Template Teil-Spezialisierung: Warum kann ich nicht den letzten Typ in variadic-template anpassen?

8

Ich versuche, eine IsLast type Traits zu schreiben, um zu prüfen, ob ein bestimmter Typ der letzte in std::tuple ist, aber der folgende Code kompiliert nicht. Ich weiß, wie ich es umgehen kann, aber ich bin neugierig, warum der Compiler es nicht mag. Ich denke, es muss eine Regel über die Spezialisierung von variadic-template geben, die mir nicht bekannt ist.

Der Code befindet sich unter: Ссылка

Fehlermeldung:

%Vor%

Es gibt auch eine Warnung zur Spezialisierungserklärung:

  Warnung

: Die partielle Spezialisierung der Klassenvorlage enthält Vorlagenparameter, die nicht abgeleitet werden können. Diese partielle Spezialisierung wird nie verwendet werden

%Vor%     
xin wang 04.02.2017, 16:28
quelle

4 Antworten

8

In einer Klassenvorlage muss das Parameterpaket hinter allen anderen Vorlagenparametern stehen, daher ist so etwas nicht erlaubt.

%Vor%

In einer Funktionsvorlage können nach dem Paket nur dann weitere Vorlagenparameter vorhanden sein, wenn sie abgeleitet werden können. Dies ist für Klassenvorlagen nicht zulässig, da sie keinen Abzug zulassen.

    
Sam Marinelli 04.02.2017 16:45
quelle
3

Wie bei Resurrection beobachtet, muss variadic template in der letzten Position sein.

Aber es gibt viele andere Möglichkeiten, um das gleiche Ergebnis zu erhalten.

Die offensichtliche Lösung besteht darin, eine rekursive Art von Merkmalen zu erstellen, aber ich zeige Ihnen eine Lösung basierend auf std::tuple_element

%Vor%

Beachten Sie, dass IsLast mit

zusammenarbeitet %Vor%

und mit anderen Vorlagenklassen.

    
max66 04.02.2017 17:07
quelle
2

EDIT: Dank dem Bogdan-Kommentar ist das Standard-Zitat jetzt das richtige!

Laut temp.deduct.type # 9 :

  

Wenn die Vorlagenargumentliste von P eine Stapelerweiterung enthält, die nicht das letzte Vorlagenargument ist, ist die gesamte Vorlagenargumentliste ein nicht abgeleiteter Kontext

Beachten Sie, dass das Paket nur in der Argument Liste der Vorlage das letzte sein muss. Das Template-Parameterpaket muss nicht das letzte in der Template-Liste Parameter sein, dies kann der Fall sein für Template-Class-Teilspezialisierungen oder Template-Funktionen.

Also ist Ihr erstes Beispiel für eine Klassenspezialisierung richtig:

%Vor%

Weil V... das letzte Argument von tuple ist.

%Vor%

Weil V... nicht das letzte Argument von tuple ist.

    
Oliv 05.02.2017 09:46
quelle
0

Es gibt eine bessere Lösung:

%Vor%     
The Techel 04.02.2017 16:57
quelle