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 zusammen

    int
    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;
    };
    

Anmelden zum Antworten