template typen einschränken
-
::boost::is_integral<T>::value
::boost::is_float<T>::value
::boost::is_pointer<T>::valuesieht gut aus aber wie arbeitet des zeuch intern?
ich hab kein boost auf meinen plattformen verfügbarnur standard c/c++
-
Sovok schrieb:
sieht gut aus aber wie arbeitet des zeuch intern?
Ich denke, das funktioniert so ähnlich wie auch die Loki-TypeTraits (hab Boost-TypeTraits nur mal überflogen *duck*) über vollständige oder partielle Template-Spezialisierung (siehe Link von oben).
Aus der Loki-Bib. könntest du z.B.
TypeTraits<T>::isStdFundamental
(returns (at compile time) true if T is a standard fundamental type) und
TypeTraits<T>::isPointer
(returns (at compile time) true if T is a pointer type) benutzen.
-
fubar schrieb:
Aus der Loki-Bib. könntest du z.B.
TypeTraits<T>::isStdFundamental
(returns (at compile time) true if T is a standard fundamental type) und
TypeTraits<T>::isPointer
(returns (at compile time) true if T is a pointer type) benutzen.das is doch der punkt... wie find ich raus obs n pointer is?
ich blick das nichps: is fundamental das gegenteil von pointer bzw. aufm stack?
-
#include <iostream> template <class T> struct TypeTraits { private: template <class U> struct PointerTraits { enum { result = false }; }; template <class U> struct PointerTraits<U*> { enum { result = true }; }; public: enum { isPointer = PointerTraits<T>::result }; }; class TestClass {}; int main() { std::cout << TypeTraits<TestClass >::isPointer << std::endl; std::cout << TypeTraits<TestClass*>::isPointer << std::endl; }
isStdFundamental bedeutet Fließkomma-, Ganzzahltyp oder void.
-
kann ich das zur kompilier oder linkzeit noch abfangen falls
isPointer == false is?
-
Ja, das geht IMHO z.B. so:
#include <iostream> #include <loki/static_check.h> #include <loki/TypeTraits.h> class TestClass {}; template <typename T> void function(T t) { STATIC_CHECK(Loki::TypeTraits<T>::isPointer, NOT_A_POINTER); } int main() { TestClass c1; function(c1); //gibt Fehler beim Kompilieren TestClass* c2 = new TestClass(); function(c2); //funktioniert }
STATIC_CHECK sieht so aus: http://www.visualco.de/idiom/samples/Loki/html/c$$libReference$static_che69.html
Vielleicht könnte man das aber auch anders (== besser) lösen?!?
-
kann ich das zur kompilier oder linkzeit noch abfangen falls
isPointer == false is?Ja so:
tempalte<class T,int size=sizeof(T)> class A; tempalte<class T> class A<T,4>{ //... };
So muss T 4 byte gross sein. Das ganze kannst do aber auch mit bool machen:
tempalte<class T,int blalba=is_foo<T>::result> class A; tempalte<class T> class A<T,1>{ //... };
Somit mus T foo sein.
-
fubar schrieb:
Ja, das geht IMHO z.B. so:
TestClass c1; function(c1); //gibt Fehler beim Kompilieren TestClass* c2 = new TestClass(); function(c2); //funktioniert
habs jetzt schon ein paar mal nachgebaut... klappt aber nicht
ich kann feststelln obs n long,bool oder sonst ein standard typ is
aber die unterscheidung zwischen klasse und klassenpointer klappt nicht
-
Ich glaube, es gibt Portierungen für viele Compiler; welchen benutzt du? Lad dir doch mal die Loki-Bib. herunter, und teste, ob vielleicht eine der Portierungen funktioniert?!?
-
ich kann feststelln obs n long,bool oder sonst ein standard typ is
aber die unterscheidung zwischen klasse und klassenpointer klappt nichtVielleicht kennt dein Compiler die dazu nötige partielle Spezialisierung nicht?
ansonten
template <typename T> struct IsPointer { enum {value = false}; }; template <typename T> struct IsPointer<T *> { enum {value = true}; };