Satt eines asserts einen Compilerfehler erzeugen...



  • Bei variabler Länge geht das natürlich nicht...

    Ansonsten kannst du für die Grösse einen weiteren Templateparameter angeben. Dann kannst du beispielsweise mit BOOST_STATIC_ASSERT zur Compilierzeit prüfen.



  • Wie kann ich denn für die Größe einen template-parameter mitgeben? Bisher habe ich die Größe über den Konstruktor übergeben. Aber ich dachte in die templates kann man nur Typdefinitionen oder halt Typen übergeben. für die Größe müsste ich doch eine statische Variable übergeben?!



  • Nexus schrieb:

    Bei variabler Länge geht das natürlich nicht...

    Ansonsten kannst du für die Grösse einen weiteren Templateparameter angeben. Dann kannst du beispielsweise mit BOOST_STATIC_ASSERT zur Compilierzeit prüfen.

    ich führe deine gedanken fort und optimiere ein wenig:

    template <class T,size_t SA,size_t SB> 
    bool operator == (const Vector<T,SA> &vector_a, const Vector<T,SB> &vector_b){
       static_assert(SA==SB,"geht nicht");
       ...
    

    und dann

    template <class T,size_t SA,size_t SB> 
    bool operator == (const Vector<T,S> &vector_a, const Vector<T,S> &vector_b){
       static_assert(S==S,"geht nicht");//rem kann vermutlich weg
       ...
    


  • gentoo schrieb:

    Wie kann ich denn für die Größe einen template-parameter mitgeben?

    Man kann nicht nur Typen als Templateparameter haben.

    template <typename T, unsigned int N>
    class Vector
    {
        // ...
    };
    
    Vector<float, 3> Vec;
    

    Und volkard, wieso nicht gleich so?

    template <typename T, unsigned int N>
    bool operator== (const Vector<T, N>& Left, const Vector<T, N>& Right)
    {
        // ...
    }
    

    static_assert hätte zwar den Vorteil einer besseren Fehlermeldung, aber momentan ist das ja nicht wirklich ein Thema.



  • Nexus schrieb:

    Und volkard, wieso nicht gleich so?

    template <typename T, unsigned int N>
    bool operator== (const Vector<T, N>& Left, const Vector<T, N>& Right)
    

    hab ich doch gemeint. in der ersten zeile hab ich nur das A und B zu löschen vergessen. in der zeile drunter isses schon weg.



  • Ich wuerde dir die Lektuere Moder C++ Design von Andrei Alexandrescu empfehlen. Da wird auch gezeigt, wie man sich ein einfaches static_assert Template bastelt (man muss nicht fuer alles Boost verwenden). Und das schon im Vorwort! Vielleicht git es das als Leseprobe irgendwo. Der Rest des Buches ist aber auf einem sehr hohem Niveau, und ungeeignet fuer Anfaenger.



  • Möglichkeiten gibt es da ja viele, beispielsweise Arrays mit negativen Indices, eine ausgelassene Templatespezialisierung. Beides recht trivial zu verwirklichen, da muß er nicht gleich den Alexandrescu lesen.



  • audacia schrieb:

    Möglichkeiten gibt es da ja viele, beispielsweise Arrays mit negativen Indices, eine ausgelassene Templatespezialisierung. Beides recht trivial zu verwirklichen, da muß er nicht gleich den Alexandrescu lesen.

    Aber vielleicht das Vorwort :-).



  • audacia schrieb:

    Beides recht trivial zu verwirklichen,

    Und beides recht unschön zu verstehen, wenn da irgendwelche obskuren Compilerfehler stehen.
    Man muss außerdem den Alexandrescu nicht lesen und verstehen um sich die Loki-Bibliothek runterladen zu können 😉

    Direkt der Code für static_check:
    http://loki-lib.sourceforge.net/html/a00676.html



  • Ja, aber das ist schon die fortgeschrittene Version von static_assert, dass eine "lesbare" Fehlermeldung produziert.



  • knivil schrieb:

    Ja, aber das ist schon die fortgeschrittene Version von static_assert, dass eine "lesbare" Fehlermeldung produziert.

    Ja. Und? Was spricht dagegen eine ausgereifte Version zu benutzen?
    Ich benutz doch auch die "fortgeschrittene" Version einer Liste, nämlich std::list<>, mit Iteratoren und allem und beharre nicht auf der list die ich irgendwann in den ersten Wochen meiner C++-Karriere mal in den Editor gehackt habe.



  • VIelleicht ist er eher noch Anfaenger in Templateprogrammierung und will wissen, wie sowas funktioniert. Da ist die Version im Vorwort von dem Buch schon erleuchtender.


Anmelden zum Antworten