Satt eines asserts einen Compilerfehler erzeugen...
-
Ich habe eine kleine Vector-Klasse (im math. Sinne) geschrieben und möchte dass diese eine variable Länge haben kann.
Leider Ergibt dass bei einigen Operatoren Probleme, die ich bisher mit asserts löse. Z.B. so:template <class T> bool operator == (const Vector<T> &vector_a, const Vector<T> &vector_b) { assert(vector_a.m_vData.size() == vector_b.m_vData.size() ); for(unsigned int i = 0; i < vector_a.m_vData.size(); i++) { if( vector_a.m_vData[i] != vector_b.m_vData[i]) { return false; } } return true; }Nun würde ich aber lieber auf diese blöden asserts verzichten und stattdessen schon zur Compilerzeit prüfen wie groß der jeweilige Vektor ist und falls die Inkompatibel sind, soll abgebrochen werden. Weis jemand wie man das besten mit GCC bewerkstelligen kann und evtl eine Beispiel geben.
Mfg.
-
Woher soll denn der Compiler wissen, wie groß die Vektoren mal werden?
-
dazu müßte aber die größe im typ stecken, denke ich.
-
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_ASSERTzur 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_ASSERTzur 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_asserthä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.