STATIC_ASSERT
-
Hallo,
zumindest unter dem VC 6.0 funktioniert BOOST_STATIC_ASSERT hier nicht so wie erwünscht.Hier würde ich dir sowas vorschlagen:
template <class T> struct s_assert { template <bool b> struct In; template <> struct In<true> {}; }; #define STATIC_ASSERT(b) enum {a = sizeof(s_assert<T>::template In<b>)} template<class T> class Foo { STATIC_ASSERT(false); }; template<> class Foo<int> { void foobar(); }; template<> class Foo<double> { int barfoo(); }; Foo<double> ok; Foo<char> error;
Oder in Standard-C++:
template <class T, bool> class s_assert; template <class T> class s_assert<T, true> {}; #define STATIC_ASSERT(b) enum {a = sizeof(s_assert<T, b>)}
Wichtig ist auf jeden Fall, dass dein Test abhängig vom Templateparameter ist, da er ansonsten bereits im Basetemplate ausgeführt wird -> Fehler.
-
sorry. hab falsch geguckt.
ich dachte, er würde bei#include <boost/static_assert.hpp> template<class T> struct Foo { BOOST_STATIC_ASSERT(false); }; template<> struct Foo<int> { void foobar(); }; template<> struct Foo<double> { int barfoo(); }; int main(){ Foo<double> f; }
die assertion melden. ist aber nicht der fall. das ist gut.
-
...nur der VC 6 bekommt das natürlich wieder nicht auf die Reihe
-
HumeSikkins schrieb:
Wichtig ist auf jeden Fall, dass dein Test abhängig vom Templateparameter ist, da er ansonsten bereits im Basetemplate ausgeführt wird -> Fehler.
ja, diesen effekt hatte ich auch, als ich aus boost/static_array mit nur den code für die generic version rauskopiert hatte. (ich benutze MinGW studio).
ich habs aber so gelöst:#define STATIC_ASSERT(B) typedef char _staticAssert##__LINE__[2*bool(B)-1];
ist zwar doch nicht abhängig, aber klappt und ist erfreulich einfach.
-
HumeSikkins schrieb:
...nur der VC 6 bekommt das natürlich wieder nicht auf die Reihe
ich hab meinen vc6 jetzt in den ruhestand geschickt.
-
volkard schrieb:
HumeSikkins schrieb:
...nur der VC 6 bekommt das natürlich wieder nicht auf die Reihe
ich hab meinen vc6 jetzt in den ruhestand geschickt.
Ich warte damit noch bis ich mein Windows 98 in den Ruhestand schicke...
-
HumeSikkins schrieb:
Hallo,
zumindest unter dem VC 6.0 funktioniert BOOST_STATIC_ASSERT hier nicht so wie erwünscht.Hier würde ich dir sowas vorschlagen:
template <class T> struct s_assert { template <bool b> struct In; template <> struct In<true> {}; }; #define STATIC_ASSERT(b) enum {a = sizeof(s_assert<T>::template In<b>)} template<class T> class Foo { STATIC_ASSERT(false); }; template<> class Foo<int> { void foobar(); }; template<> class Foo<double> { int barfoo(); }; Foo<double> ok; Foo<char> error;
...
Hallo,
kannst du mir erklaeren, was genau hier passiert? Hab Probleme, dass genau
zu verstehen.mfg
v R
-
HumeSikkins schrieb:
Ich warte damit noch bis ich mein Windows 98 in den Ruhestand schicke...
das will ich sehen ....
-
#define STATIC_ASSERT(b) enum {a = sizeof(s_assert<T>::template In<b>)}
wenn b false ist funktioniert sizeof nicht, weil es von s_assert::In nur für true eine spezialisierung gibt und der rest nicht definiert ist.
HumeSikkins schrieb:
Oder in Standard C++
template <class T, bool> class s_assert; template <class T> class s_assert<T, true> {}; #define STATIC_ASSERT(b) enum {a = sizeof(s_assert<T, b>)}
Wichtig ist auf jeden Fall, dass dein Test abhängig vom Templateparameter ist, da er ansonsten bereits im Basetemplate ausgeführt wird -> Fehler.
-
davie schrieb:
#define STATIC_ASSERT(b) enum {a = sizeof(s_assert<T>::template In<b>)}
wenn b false ist funktioniert sizeof nicht, weil es von s_assert::In nur für true eine spezialisierung gibt und der rest nicht definiert ist.
HumeSikkins schrieb:
Oder in Standard C++
template <class T, bool> class s_assert; template <class T> class s_assert<T, true> {}; #define STATIC_ASSERT(b) enum {a = sizeof(s_assert<T, b>)}
Wichtig ist auf jeden Fall, dass dein Test abhängig vom Templateparameter ist, da er ansonsten bereits im Basetemplate ausgeführt wird -> Fehler.
Jetzt isses klar, danke!
mfg
v R