Ich habe den folgenden Code versucht, aber es gibt:
main.cpp: 29: 22: error: aggregate 'pop<std::tuple<int, char, float> > p'
hat einen unvollständigen Typ und kann nicht definiert werden
Was vermisse ich?
%Vor%Wenn Ts ... am Ende in einer Typenliste stehen muss, warum funktioniert es in diesem Beispiel von Ссылка :
%Vor% tuple<Ts..., E>
ist ein nicht-abgeleiteter Kontext. [temp.educt.type] / 9:
Wenn
P
ein Formular hat, das<T>
oder<i>
enthält, dann wird jedes ArgumentP
i der jeweiligen Template-ArgumentlisteP
mit dem entsprechenden Argument% verglichen co_de% i der entsprechenden Template-Argumentliste vonA
. Wenn die Liste der Schablonenargumente vonA
eine Erweiterung des Stapels enthält, die nicht das letzte Schablonenargument ist, ist die gesamte Liste der Schablonenargumente ein nicht abgeleiteter Kontext.
Das bedeutet, dass Ihre Teilspezialisierung nie übereinstimmt.
Mit C ++ 14 könnte man
verwenden %Vor%So dass
%Vor%Kompiliert.
Demo .
Ts...
muss das letzte Element einer Typliste sein, wenn Sie es ableiten wollen. tuple<Ts...,E>
leitet Ts...
nicht ab, sondern nur die letzte, aber niemals etwas.
Das letzte Argument loszuwerden ist ein bisschen Tricker. Live-Beispiel :
%Vor% pop_helper
verschiebt die Typen nacheinander auf die rechte Seite, bis nur noch ein Typ auf der linken Seite übrig ist. Dann gibt es den rechten Seitentyp zurück.
pop
übergibt einfach die Tupel.
Ich habe template<class...>class Tup
anstelle von std::tuple
verwendet, weil warum nicht fast alle template
anstatt nur std::tuple
?
pop_t
beseitigt den lästigen typename
Spam am Ort der Verwendung.
Ich benutze das "Inherstance-as-type-map-forwarding" -Muster, das beim Tippen spart. Mit einer Typ-Map die Struktur:
%Vor% kann als bob<X>
is foo<X>
gelesen werden. Die Alternative ist die ausführlichere
Das Erweitern von Variant-Typ-Listen unterscheidet sich von ihnen. Bei der Entwicklung wurde der Abgleich einfach gehalten, damit Compiler-Anbieter die Funktion implementieren konnten. Es kann sogar dornige Probleme jenseits "es ist schwierig" auf diesem Pfad geben.
Tags und Links c++11 variadic-templates