Floating point concept für templates
-
Nexus schrieb:
An
enable_ifstört mich, dass die Schnittstelle unübersichtlich wirdJa, mich auch.
Wenn man nur ne Fehlermeldung will finde ich
static_assert()gut. Kommt IMO einfach drauf an was man will/braucht.
Also ob es sofort ne Fehlermeldung geben soll, oder andere Overloads berücksichtigt werden sollen (SFINAE halt).Und so lange ich mir nicht sicher bin was die bessere Variante ist, tendiere ich zu
static_assert(), da man damit schneller ne Fehlermeldung bekommt. Und das ist IMO immer gut, wenn man was macht, was nicht vorgesehen war (und es kann nicht gut vorgesehen gewesen sein, wenn man sich nicht sicher war ob man SFINAE braucht oder nicht).BTW: auch MSVC 10 gibt mit
static_assert()ne brauchbare Fehlermeldung aus:1>vc10test.cpp(7): error C2338: will floating point!!!11elf 1> vc10test.cpp(13) : see reference to function template instantiation 'void foo<int>(T)' being compiled 1> with 1> [ 1> T=int 1> ]
-
berndbernd schrieb:
Sehe ich das richtig, dass ich auf alle Fälle eine Standard-Template-Deklaration brauche und dann halt die Spezialisierung mit dem enable_if für Floatingpoint-Typen - selbst wenn es die Klasse ausschließlich für Floatingpoint-Typen geben soll?
So ist es in der Hilfe beschrieben. Wobei ich nicht ausschließen will, dass es noch andere Lösungen gibt.
In Deinem Fall sähe es wohl so aus:#include <boost/type_traits/is_floating_point.hpp> #include <boost/utility/enable_if.hpp> template< typename T, typename Enable = void > struct Foo; // undefined struct template< typename T > struct Foo< T, typename boost::enable_if< boost::is_floating_point< T > >::type > { // ... hier kommt die Implementierung von Foo<T> }; int main() { Foo< double > d; Foo< int > i; // <== Compilefehler: 'i' uses undefined struct 'Foo<T>' return 0; }Gruß
Werner