Template - Variablentyp erkennen - aber wie?



  • Wieso erhältst du eine Fehlermeldung mit "char()[4]" ich sehe nirgends ein char()[4]. hast du vielleicht noch mehr code?
    warum musst du data mit nullen füllen?
    hast du schon cd9000s vorschlag mit dem überladen ausprobiert?



  • Ich arbeite mit dem CBuilder dort glaube ich gesehn zu haben
    im "Hilfe Index der IDE" das es sowas wie ein Sclüsselwort
    typeof oder typeId und ein entsprechendes Beispiel
    wo das glaube so verwendet wird

    if( a typeof class Buch)....
    

    In JAVA gibts sowas auf jedenfall!!!
    mfg 😉



  • auf jedenfall hat er mit templates in diesem fall die schnellere und elegantere version 😉



  • ich habs jetzt mal so getestet:

    template <class _data_>class charData {
    private:
    	template <typename T> void Test(T&)     {/* mach nix */ OutputDebugString("Class\n");}; 
    	template <>           void Test(BYTE& i) { i = 0; OutputDebugString("BYTE\n");} 
    	template <>           void Test(int& i) { i = 0; OutputDebugString("INT\n");} 
    	template <>           void Test(long& i) { i = 0; OutputDebugString("LONG\n");} 
    	template <>           void Test(double& i) { i = 0; OutputDebugString("DOUBLE\n");} 
    	template <>           void Test(char i) { i=char(0); OutputDebugString("CHAR\n");} 
    	template <>           void Test(char* i) { ZeroMemory(i,sizeof(_data_)); OutputDebugString("CHAR\n");} 
    
    public:
    	_data_	raw;	
    
    	charData() {
    		Test(raw);	
    	};
    

    und es funktioniert so, das ich damit weiter arbeiten kann, auch im "release modus" 😉

    typeof gibts in Vc++ leider nicht.. hab schon danach gegoogelt 😉

    @davie:
    ja, es gibt noch code, bei dem char(*)[4] vorkommt, ich hab ganz bewußt nur "diesen" einen Ausschnitt gepostet, oder möchtest du 205KB an code hier im forum haben? 😉
    warum ich "nullen" brauch, warum nicht????

    vielen dank für tipps, hat mir weitergeholfen!!!

    mfg



  • du hast

    void Test(char* i) { //einmal ohne dieses template<>
    ZeroMemory(i,sizeof(_data_));
    OutputDebugString("CHAR\n");
    }
    

    die methode wird nur aufgerufen, wenn _data_ dasselbe wie char* ist. sizeof(char*) ist immer 1. Nicht sehr nützlich, hm? 😉
    eventuell hilft hier strlen aus <cstring> um die länge zu ermitteln.

    Also, warum jetzt ausgerechnet 0? Um das Element mit etwas "Sinnvollem" zu initialisieren, oder hat es einen speziellen Grund?

    Außerdem solltest du vermeiden den unterstrich _ am anfang eines namens zu verwenden. du bekommst sonst uU probleme.

    ps

    i = char(0)
    

    wenn du den char als '0' haben willst, dann mach

    i = '0'
    

    wenn du ihn tatsächlich 0 setzen willst, dann reicht

    i = 0
    


  • @davie: ich versteh dich nicht ganz:

    ich hab folgendes:

    template <class _data_>class charData {
    private:
    	template <typename T> void Init(T&)     {}; 
    	template <>           void Init(BYTE& i) { i = 0;} 
    	template <>           void Init(int& i) { i = 0;} 
    	template <>           void Init(long& i) { i = 0;} 
    	template <>           void Init(double& i) { i = 0;} 
    	template <>           void Init(float& i) { i = 0;} 
    	template <>           void Init(float& i) { i = 0;} 
    	template <>           void Init(char i) { i=char(0);} 
    	template <>           void Init(char* i) { 
    		long l = sizeof(_data_);  // extra für davie ;-)
    		ZeroMemory(i,l);
    	} 
    
    public:
    	_data_	raw;	
    
    	charData() {
    		Init(raw);	
    	};
    };
    

    zum Aufruf:

    charData<char>    c;    // geht in Init(char i)
    charData<char[5]>    c5; // geht Init(char* i) wobei l = 5 ist!
    charData<char[1]>    c1; // geht Init(char* i) wobei l = 1 ist!
    

    was stimmt daran jetzt nicht?
    und was ist mit char(0) oder '0' ??? was ist daran falsch? beides geht!



  • PS: der Aufruf charData<char*> hat hier keine Verwendung!



  • ok, wenn du es so genau angibst, dann geht es. nur sizeof(char*) ist nicht sizeof(char[4]).
    nur wenn du einmal

    charData<char*> c("foo");
    

    verwendest, bekommst du die länge nicht durch sizeof(data)

    char(0) und '0' gehen beide, richtig.
    es gehen auch cout<<"foo" und cout<<"bar".
    nur die ergebnisse sind anders.

    char(0) != '0'
    char(0) == '\0' //idr
    


  • davie schrieb:

    nur sizeof(char*) ist nicht sizeof(char[4]).

    Bei mir schon :p



  • schon klar das "sizeof(char*) " die größe der addresse ergibt,

    und char(0) passt schon für meine zwecke 😉


Anmelden zum Antworten