erkennen des Variablen-Typs zur laufzeit



  • hiho,
    also ich möchte eine template-klasse schreiben, bei der ich dann zur laufzeit feststelle, welchen Typ die dem konstruktor übergebene Variable hat...
    es kommt mir insbesondere darauf an, ob ein

    signed
    

    oder

    unsigned
    

    übergeben wurde

    template<class T>
    class cClass
    {
      public:
        cClass(T num){num_ = num};
        type WhatType()
        {
    //     >> gesuchter Code
        };
      private:
        enum type{signedlong,unsignedlong,sigendshort,unsignedshort};
        long num_;
    };
    

    wie kann ich jetzt überprüfen, ob ich einen sigen oder unsigned habe ? und evtl. auch ob es ein short oder long ist ?



  • Tag,

    das kannst du z. B. so machen:

    template<typename T>
    void func(const T& t);
    
    template<>
    void func(const signed int& t) {
    	cout<<"signed"<<endl;
    }
    
    template<>
    void func(const unsigned int& t) {
    	cout<<"unsigned"<<endl;
    }
    
    int main() {
        signed a(0);
        unsigned b(0);
        func(a);
        func(b);
    }
    

    mfg
    v R



  • x ist unsigned wenn

    x = 0;
    ((x-1) != -1) ist.

    ein char hast du z.B. wenn

    x = 0
    (x-1) == 255 ist.



  • Gast221212 schrieb:

    x ist unsigned wenn

    x = 0;
    ((x-1) != -1) ist.

    das widerspricht sich doch



  • Gast221212 schrieb:

    x ist unsigned wenn

    x = 0;
    ((x-1) != -1) ist.

    Und wie soll das Fehler in Kernel32.dll helfen? Zudem ist es absoluter Käse. Der rechte Operand (-1) ist zwar signed (int), das heisst doch aber noch lange nicht, dass der linke Operand deshalb auch signed ist. In so einem Fall würde ein ordentlicher Compiler zB eine signed/unsigned mismatch Warnung ausspucken.

    Gast221212 schrieb:

    ein char hast du z.B. wenn

    x = 0
    (x-1) == 255 ist.

    Dito. Zudem versteh ich nicht ganz, was das mit der Fragestellung zu tun hat. Oder geht's dir darum, zu ermitteln, ob char signed oder unsigned ist?

    Fehler in Kernel32.dll schrieb zwar was von Unterscheidung zur Laufzeit, wenn's aber um signed/unsigned geht, dann ist compile-time auf jeden Fall der richtige Weg. Und da ist Überladung bzw. Template Spezialisierung (wie in virtuell Realisticer's Beispiel) an geeignetsten.



  • Fehler in Kernel32.dll schrieb:

    template<class T>
    class cClass
    {
      public:
        cClass(T num){num_ = num};
        type WhatType()
        {
    //     >> gesuchter Code
        };
      private:
        enum type{signedlong,unsignedlong,sigendshort,unsignedshort};
        long num_;
    };
    

    oder so...

    template<typename T> 
    class cClass 
    { 
      public: 
        cClass(T num){num_ = num;}
        void WhatType() 
        { 
            if (sizeof(long) == sizeof(T))
                printf ("long ");
            else if (sizeof(short) == sizeof(T))
                printf ("short ");
            else if (sizeof(char) == sizeof(T))
                printf ("char ");
            if (T(-1) < 0)
                printf ("signed\n");
            else
                printf ("unsigned\n");
        }; 
      private: 
        long num_; 
    }; 
    
    ...
        cClass <int>a(10);
        a.WhatType();
    
        cClass <unsigned char>b(10);
        b.WhatType();
    ...
    


  • wieso etwas zur laufzeit rauskriegen wollen, wenns zur compilezeit bereits feststeht?

    http://www.boost.org/libs/type_traits/index.html

    besodners interessant hierbei:

    ::boost::is_integral<T>::value//ist T ein integer typ?
    ::boost::is_same<T,U>::value//ist T der selbe Typ wie U?


Anmelden zum Antworten