remove_const für Template mit Spezialisierung



  • 27 Sekunden! 🙂

    Sone schrieb:

    Ist das seit C++11 erlaubt?

    Wieso C++11? Das war schon immer erlaubt...

    Nein, das war vor deiner Zeit. In C++03 waren lokale Typen als Templateargumente noch verboten. Soll ich dir die Stelle im Standard raus suchen 😉



  • Sone schrieb:

    KasF schrieb:

    Sone schrieb:

    int main()
    {
        struct NoTemplate {};
    
        Y<NoTemplate>::get();
    }
    

    😮 Ist das seit C++11 erlaubt?

    Wieso C++11? Das war schon immer erlaubt...

    Das stimmt nicht. Funktionslokale Typen durften früher nicht als Template-Argumente verwendet werden.



  • Merkwürdig. Wo genau ist denn der konzeptuelle Unterschied von einer funktionslokalen Klasse zu einer Klasse, die nach dem Template deklariert(-finiert) wurde? Wieso hat C++03 da eine solches Verbot ausgehängt* 😕

    Aber du hast vollkommen Recht, das war vor dieser Ära in der ich "aufgewachsen" bin.

    ~* Ich habe das Gefühl, Herb Sutter hat bestimmt etwas dazu geschrieben.~



  • Hi,

    Sone:
    Cool, dankeschön. 🙂

    Leider verstehe ich den Code nicht ganz. Wenn bei is_specialization Argumente mit T=O<int> und U=O reinkommen wie bei Deiner 3. static_assert -Zeile, wieso matcht er dann auf Deinen is_specialization_impl - true_type ? Die Spezialisierung besagt dort doch beim ersten Argument U<V> , was hier dann O<O<int>> . Hm, nagut, das ist ja valide. Aber mit T=NoTemplate, U=O (erste static_assert -Zeile), würde die Spezialisierung ja O<NoTemplate> als erstes Argument erhalten, was dann genau so valide erscheint.

    Wäre super, wenn Du mich von meinen Irritationen/Denkfehlern befreien könntest. 🙂

    camper:
    Du meinst, bei fak<0> instanziiert er fak<-1>? Wieso führt das dann nicht zur Endlosrekursion?

    Zur Verkürzung: Stimmt, gar nicht bedacht, dass nur die TA-Typgleichheit gewährleistet sein muss, dankeschön. 🙂

    Beste Grüße,
    Eisflamme



  • Du meinst, bei fak<0> instanziiert er fak<-1>? Wieso führt das dann nicht zur Endlosrekursion?

    Tut es ja gerade. Der Code ist nicht gültig. Es führt zu einer sehr großen Template-Instantiierungstiefe.

    Wenn bei is_specialization Argumente mit T=O<int> und U=O reinkommen wie bei Deiner 3. static_assert-Zeile, wieso matcht er dann auf Deinen is_specialization_impl-true_type?

    Weil es passt? T wird bei der partiellen Spezialisierung int sein, und U=O. Daher matcht diese für alle Fälle, wo U<T> übergeben wird - T wird dann zum Argument von U deduziert.

    Aber mit T=NoTemplate, U=O (erste static_assert-Zeile), würde die Spezialisierung ja O<NoTemplate> als erstes Argument erhalten

    Nein! Denn T ist ja nicht O<NoTemplate> ! T ist NoTemplate, und daher passt das nicht.

    Du weißt doch, wie partielle Spezialisierungen funktionieren? 🙂



  • @fak: Okay 🙂

    @Deine Lösung:
    Hm, ich glaube, jetzt verstehe ich das, aber da ist der Compiler ja irgendwie schon ziemlich schlau?

    Gut, die partielle Spezialisierung heißt, dass er versucht auf einen U<T>-Typ zu matchen. Also muss U schon Mal O sein und T kann er sich dann angeln (deduzieren). Hm, hm... das ist logisch. Mein Denkfehler war, dass ich dachte, wenn U<T> erwartet wird und es ein T = NoTemplate gibt, dass er sich dann einfach selbst einen Typ U<NoTemplate> basteln könnte. Der darf aber nicht basteln, sondern soll nur matchen und wenn ihm innendrin was fehlt (also das Innere von U<.>), dann darf er sich das eben aus dem Template-Argument ziehen.

    Wenn jemand Lust hat, kann er das ja nochmal umformulieren oder versuchen es anders zu pointieren, auf alle Fälle glaube ich es jetzt verstanden zu haben, danke. 🙂



  • Okay, also für partielle Spezialisierung kann man sich nicht einfach eigene Typen aus bestehenden Template-Argumenten zusammenbauen, sondern kann nur einen besseren Match definieren, verstehe.

    Wenn man sich eigene Typen aus Template-Argumenten zusammenbauen möchte, läuft man eben über Vererbung, da hatte ich aber ganz schön was falsch im Kopf. 🙄


Anmelden zum Antworten