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_specializationArgumente mit T=O<int> und U=O reinkommen wie bei Deiner 3.static_assert-Zeile, wieso matcht er dann auf Deinenis_specialization_impl-true_type? Die Spezialisierung besagt dort doch beim ersten ArgumentU<V>, was hier dannO<O<int>>. Hm, nagut, das ist ja valide. Aber mit T=NoTemplate, U=O (erstestatic_assert-Zeile), würde die Spezialisierung jaO<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
intsein, und U=O. Daher matcht diese für alle Fälle, woU<T>übergeben wird - T wird dann zum Argument vonUdeduziert.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.
