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%Vor%: Die partielle Spezialisierung der Klassenvorlage enthält Vorlagenparameter, die nicht abgeleitet werden können. Diese partielle Spezialisierung wird nie verwendet werden
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.
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
Beachten Sie, dass IsLast
mit
und mit anderen Vorlagenklassen.
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.
Weil V...
nicht das letzte Argument von tuple
ist.
Tags und Links c++ c++11 templates variadic-templates partial-specialization