template Parameter modifizieren
-
Der Name ist Programm:
Kann ich so etwas irgenendwie hinbekommen:
template<typename T> class MyClass{ unsigned T obj; };
Also den template Parameter nochmals modifizieren. Natürich würde das nur für buid-in Zahltypen funktionieren.
-
vielleicht hilft das?
template<typename T> struct ToUnsigned; template<> struct ToUnsigned<int>{ typedef unsigned int Result; }; template<> struct ToUnsigned<unsigned int>{ typedef unsigned int Result; };
template<typename T> class MyClass{ typename ToUnsigned<T>::Result obj; };
-
Nur indem du entsprechend spezialisierst:
template< typename T > struct AddUnsigned; template<> struct< unsigned int > { typedef unsigned int utype; }; template<> struct< int > { typedef unsigned int utype; };
das für alle integralen typen und dann kannst einfach AddUnsigned< T >::utype schreiben, und wenn es kein definierter Typ ist, dann gibts nen Fehler, da es nur spezialisierte Versionen von AddUnsigned gibt.
Würd allerdings nen schöneren Namen nehmen
-
Ok, die beiden(sind ja recht ähnich :D) Workarounds sind gut möglich.
In beiden Fällen müsste ich jedoch für jeden Typ einzen definieren.
Alerdings kommen im Extremfall schon nen paar Typen zusammenint char long short __int8 __int16 __int32 __int64
-
Ok, das war doppelt gemoppelt mit den __intX Typen.
Wenn es mir allein um das "verbieten" der Parameterisierung mit signed Typen geht, könnte man ja aber auch geich schreiben:template<typename T> class TypeCheck; template<typename T> class TypeCheck<unsigned int> { typedef T saveT; }; template<typename T> class TypeCheck<unsigned long> { typedef T saveT; }; template<typename T> class TypeCheck<unsigned short> { typedef T saveT; }; template<typename T> class TypeCheck<unsigned char> { typedef T saveT; }; //MyClass dann so: template<typename _T> class MyClass{ typedef TypeCheck<_T>::saveT T; T obj; };