Forum: PC-Programmierung C++ type trait, type deduction für leeres variadic pack


von Vincent H. (vinci)


Lesenswert?

Grüß euch

Ich bin heute draufgekommen dass einer meiner type traits zur Erkennung 
von "ist von Template geerbt" für einen Sondernfall nicht richtig 
funktioniert. Der volle Code findet sich hier:

https://ideone.com/UVq3Pz

Wie man am Output sieht funktioniert der trait für s0 und s1, für s2 
jedoch nicht. Ich vermute dass das was mit der type deduction des leeren 
variadic packs zu tun hat...

Hat wer eine Idee wie man in dem Fall drumherum basteln könnte?

tia

von Dr. Sommer (Gast)


Lesenswert?

Zeile 21 auskommentieren und auf die Compiler Fehler achten kann ggf. 
beim Debuggen helfen...

Beitrag #5349567 wurde vom Autor gelöscht.
von Vincent H. (vinci)


Lesenswert?

Meine neueste Vermutung ist, dass die EBO bei std::tuple irgendwie 
Schuld ist. In die bin ich auch schon bei folgendem Bug gelaufen: 
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71096

Leg ich eine eigene Typliste von der ich wiederum erbe, dann 
funktioniert der trait...

von Micha (nichtgast)


Lesenswert?

Ich weiß nicht, ob dir das weiterhilft,

mit VS2017 ist die ausgabe richtig (1,1,1)

von Dr. Sommer (Gast)


Lesenswert?

Vincent H. schrieb:
> Meine neueste Vermutung ist, dass die EBO bei std::tuple irgendwie
> Schuld ist.

Gut möglich. std::tuple<X> leitet u.U. indirekt von X ab, also ist 
S<std::tuple<>> indirekt von std::tuple<> abgeleitet, somit weiß der 
Compiler nicht welche Stufe er nehmen soll. Die Zwischen-Basisklasse 
_Head_base ist zwar private was hier aber anscheinend nicht weiter 
hilft. Das S hier von std::tuple<std::tuple<>> ableitet ist gewünscht 
ja?

von Wilhelm M. (wimalopaan)


Lesenswert?

Vincent H. schrieb:
> Meine neueste Vermutung ist, dass die EBO bei std::tuple irgendwie
> Schuld ist. In die bin ich auch schon bei folgendem Bug gelaufen:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71096
>
> Leg ich eine eigene Typliste von der ich wiederum erbe, dann
> funktioniert der trait...

Ja, ich denke auch, dass Du hier Opfer des Bugs bist.

Ich habe spaßeshalber meine eigene tuple<>-Implementierung mal genommen 
(aus meinem stdlibc++-Ersatz für die AVR): damit geht es, wenn ich 
diesen Overload noch hinzufüge:
1
    static constexpr std::true_type f(const U<>&);

von Vincent H. (vinci)


Lesenswert?

Danke für eure Hilfe. Das hat mich echt einiges an Nerven gekostet. :)

Ja dass S von tuple<tuple>> Ableitet war in dem Beispiel bewusst. Das 
ist ja auch die einzige Konstellation in der der Fehler auftritt. :D
Bin da wie gesagt auch nur drüber gestolpert weil in meinem Code ein 
skuriler Randfall nicht funktioniert hat...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.