TMP Einarbeitungsprobleme
-
Hallo Leute,
ich versuche mich gerade in TMP einzuarbeiten und stoße direkt auf ein paar Verstaendnisprobleme.
Ich wollte eigentlich nur ein einfaches Beispiel probieren indem ich ein is_even Template geschrieben habe was in etwa so aussieht:
template<int size> struct is_even { enum {value = size % 2 == 0}; };Moege man sich jetzt bitte nicht ueber die Sinnhaftigkeit auslassen sondern das erstmal nur so hinnehmen wie es ist.
Dieses Template wuerde ich gerne in einem anderem Klassentemplate als "Bedingung" benutzen um ggf. Compilerfehlermeldungen zu bekommen wenn die Instanziierung des Templates keine gerade Zahl bekommen hat.
template<int size> class Square { private: int data[size*size]; };Und genau an dieser Stelle komme ich ins schwitzen, wie kann ich mein is_even Template nun als Bedingung in mein Square Template einbauen ohne es erst bei der Instanziierung zu benutzen.
-
Wenn du C++0x / C++11 hast:
template<int size> class Square { private: int data[size*size]; static_assert(is_even<size>::value, "Size must be even!"); };
-
pyhax schrieb:
Wenn du C++0x / C++11 hast:
template<int size> class Square { private: int data[size*size]; static_assert(is_even<size>::value, "Size must be even!"); };Schonmal sehr hilfreich, danke. Aber ich wuerde es auch gerne ohne Hilfe von C++ 11 machen, ist das dann auch moeglich?
-
Dann bekommst du aber nicht so eine schöne Fehlermeldung

template <bool Condition> struct MustBeEven; template <> struct MustBeEven<true> {}; template<int size> struct is_even { enum {value = size % 2 == 0}; sizeof(MustBeEven<is_even<size>::value>); };Sollte funktionieren. Alternativ Boost.StaticAssert oder Boost.MPL BOOST_MPL_ASSERT (letzteres gibt finde ich besser Fehlermeldung, wobei ersteres wenn vorhanden auch C++11 static_assert benutzen kann) benutzen
-
Das Problem ist dass nackte Statements in der Klasse verboten sind. Denkbar wäre aber sowas:
template<int size> class Square { private: int data[size*size]; static const int assertion_dummy = sizeof(MustBeEven<is_even<size>::value>); };
-
Ist das nicht auch C++11 (Direkte Zuweisung in der Klasse von static const membern?)
-
pyhax schrieb:
Ist das nicht auch C++11 (Direkte Zuweisung in der Klasse von static const membern?)
Das ist auch in C++03 für integrale Typen möglich.
-
Danke fuer die viele Einwuerfe.
Worum es mir bei der Aufgabe eigentlich geht, ist vollkommen von Dritt-Anbietern oder dem neuen Standard weg zu bleiben.
Ich moechte mich mit dem Thema so auseiandersetzen als wenn es kein Boost gibt( obwohl ich boost liebe) und als wenn den neuen Standard noch nicht gibt ( er ist einfach goettlich). Ich fange gerade erst mit TMP an und da ist es mir wichtig das ich erstmal mit den "alten" Sachen zurecht komme
Ihr versteht sicher was ich meine.
DEshalb will ich jetzt eben ein Beispiel aus der Uni mit TMP umzusetzen (wer weiß ob es ueberhaupt geht) um auch ne ordentliche Uebung zu haben. Außer Ihr habt andere nette Uebungen die man da machen koennte um reinzukommen
Bin auf jedenfall auf Ideen gespannt.
-
z.B Pi während der Compile-Time berechnen? :p
Und wenn du dann doch wieder Boost verwendest, Boost.MPL ist super
(find ich)
-
Warum nicht einfach ein Buch hernehmen: C++ Templates: The Complete Guide ?
-
Ja ich habe das Buch von Alexandrescu "Modern C++ Design" hier neben mir und les das auch ambitioniert, nur brauch ich zum verstehen auch Uebungsaufgaben an denen ich mich versuchen kann.