Erstellen einer neuen Tupel-Klasse durch Aufrufen des letzten Typs

8

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%     
Benji Mizrahi 01.12.2014, 14:06
quelle

4 Antworten

5

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 Argument P i der jeweiligen Template-Argumentliste P mit dem entsprechenden Argument% verglichen co_de% i der entsprechenden Template-Argumentliste von A . Wenn die Liste der Schablonenargumente von A 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 .

    
Columbo 01.12.2014, 14:27
quelle
3

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 ?

unterstützt werden

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

%Vor%

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.

    
Yakk 01.12.2014 14:18
quelle
1

Ein weiterer C ++ 11 Weg diese Katze zu häuten:

%Vor%     
Mike Kinghan 01.12.2014 20:32
quelle
0

Das ist die Lösung, die ich mir ausgedacht habe:

%Vor%     
Benji Mizrahi 01.12.2014 14:39
quelle

Tags und Links