Wert eines void-Zeigers



  • Hallo !!!

    Ich habe folgende Struktur

    struct t_zeiger{
    void *p;
    int typ;
    }zeiger;
    

    typ legt fest auf was zeiger zeigt:
    typ = 1 -> int
    typ = 2 -> double
    ...

    Meine Frage: Wie komme ich mithilfe einer Funktion an den Wert den Pointers.
    Das sollte dann etwa so aussehen:

    int i = getvalue(zeiger);   //für den fall, dass zeiger auf einen intger zeigt
    

    ich krieg das nich, da sich funktionen ja nicht anhand ihres rückgabewertes überladen lassen.



  • int i = *static_cast<int*>(zeiger.p);
    

    unnötig zu erwähnen, dass das in die Hose geht wenn p nicht wirklich auf einen int zeigt.

    [Edit: Mist, Frage falsch verstanden fürchte ich *g*]



  • ja, es sollte halt über eine Funktion gehen.



  • problem schrieb:

    int i = getvalue(zeiger);   //für den fall, dass zeiger auf einen intger zeigt
    

    Und wie sollte sich das jetzt verhalten, für den Fall, dass zeiger auf keinen integer zeigt?



  • #include <iostream>
    using namespace std;
    
    enum{INT,DOUBLE};
    
    template<int TYPE>
    struct Typ
    {
    	typedef void EchterTyp;
    };
    template<>
    struct Typ<INT>
    {
    	typedef int EchterTyp;
    };
    
    template<int TYPE>
    Typ<TYPE>::EchterTyp getvalue(void* p)
    {
    	return *static_cast<Typ<TYPE>::EchterTyp*>(p);
    }
    
    int main()
    {
    	int i=1;
    	void* p=&i;
    	cout<<getvalue<INT>(p);
    	return 0;
    }
    

    typen müssen aber zur compilezeit bekannt sein, also hier der typ, den cout auszugeben hat. so ganz zur laufzeit wirds nicht klappen.



  • DrGreenthumb schrieb:

    Und wie sollte sich das jetzt verhalten, für den Fall, dass zeiger auf keinen integer zeigt?

    Die Funktion soll einfach den Wert auf den der Pointer zeigt zurückgeben und zwar abhängig von typ.



  • Anonymous schrieb:

    DrGreenthumb schrieb:

    Und wie sollte sich das jetzt verhalten, für den Fall, dass zeiger auf keinen integer zeigt?

    Die Funktion soll einfach den Wert auf den der Pointer zeigt zurückgeben und zwar abhängig von typ.

    hmm, aber bei int x = funktion(zeiger); legst du ja schon fest, dass es nur ein int sein darf.



  • hmm, aber bei int x = funktion(zeiger); legst du ja schon fest, dass es nur ein int sein darf.

    das mit dem int war ja nur ein beispiel.
    die funktion sollte folgendes machen:

    switch(typ){
    case 1:
      int* p_i = (int*)p;
      return *p_i;
    case 2:
      double* p_d = (double*)p;
      return *p_d;
    }
    .
    ..
    ...
    

    aber das geht halt nich.



  • Vielleicht kannst du's ja so machen wie Volkard gezeigt hat.
    Wobei ich da vielleicht eher gleich ein Template-Struct draus machen würde, anstatt dass erst über die zusätzliche typ-Variable zu emulieren.
    Weiß ja nicht was deine Hintergrundgeschichte ist.



  • union



  • type switches vermeidet man eigentlich durch virtuelle methoden.


Anmelden zum Antworten