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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Vincent H. (vinci)


Bewertung
1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 Keiner N. (nichtgast)


Bewertung
1 lesenswert
nicht lesenswert
Ich weiß nicht, ob dir das weiterhilft,

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

von Dr. Sommer (Gast)


Bewertung
1 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.