Wie funktioniert CTAssert



  • Hallo,

    bin gerade dabei mir das Buch "Modern C++ Design"
    von Andrei Alexandrescu zu gemüte zu führen.

    Auf jeden Fall ist da im Vorwort das folgende Template
    aufgeführt, das als ziehmlich genial beschrieben wird:

    template<bool> struct CTAssert;
    template<> struct CTAssert<true> {};
    

    Irgendwie kapiere ich die Konstruktion nicht.
    Laut Buch erfolgt eine Spezialisierung auf true,
    aber nicht auf false. 😕

    Vielleicht kann mir da jemand von euch nen Tip
    geben wie dieser Konstrukt funktioniert.

    Gruss vom grübelnden Ulli



  • Guck mal: Was passiert denn, wenn du das versuchst?

    class A;
    A object;
    

    Das selbe wie hier:

    template <bool>
    struct static_assertion;
    
    template <>
    struct static_assertion<true> { }
    
    static_assertion<5 == 7> assertion;
    


  • Der Compiler beschwert sich, weil keine Spezialisierung für false existiert und das Template für allgemeine bool s nicht definiert ist.



  • CUlli schrieb:

    Irgendwie kapiere ich die Konstruktion nicht.
    Laut Buch erfolgt eine Spezialisierung auf true,
    aber nicht auf false. 😕

    Genau darin besteht der ganze Trick. Wenn du versuchst, das Template mit false zu instantiieren, wird keine passende Spezialisierung gefunden (und das allgemeine Template ist nicht definiert). Deshalb muss der Compiler eine Fehlermeldung ausgeben. Wenn darin der Name static_assertion vorkommt, sollte schon recht gut ersichtlich sein, dass eine Compilezeit-Assertion fehlgeschlagen ist. Dennoch kann es manchmal nützlich sein, noch mehr Informationen in die Fehlermeldung zu packen, Alexandrescu wird darauf noch eingehen.



  • Vielen Dank für eure Hilfe 👍

    Jetzt versteh ich das ganze schon besser !
    Und nun kapier ich auch warum er schreibt,
    dass das was fehlt genauso wichtig
    ist wie das was dasteht.
    Nochmals vielen Dank an alle,

    Gruss Ulli


Anmelden zum Antworten