komisches typedef



  • typedefs auf funktionspointer unterschieden sich etwas von solchen auf datentypen.

    typedef int xy;
    

    hier ist int der alte datentyp, xy der neue name dafür. bei funktions- oder methodenpointern ist der neue namen innerhalb des alten datentyps.

    typedef void (Class::*Method)();
    

    "Method" ist der neue name: "void (Class::*)()" ist der alte datentyp: es ist eine funktion mit rückgabetyp void und ohne parameter.



  • namenlos schrieb:

    typedefs auf funktionspointer unterschieden sich etwas von solchen auf datentypen.

    Nein, nicht im geringsten.

    Dein Beispiel ist grob irreführend, weil int ein primitiver Datentyp ist, ein Methodenzeiger ein komplexer. Gegenbeispiel:

    typedef void (Class::*type)[10];
    

  • Mod

    Bashar schrieb:

    Gegenbeispiel:

    typedef void (Class::*type)[10];
    

    Das geht nicht 😉 So aber z.B.:

    typedef int (Class::*type)[10];
    

    Für alle, die das nicht lesen können: das deklariert einen Typen type, der einen Zeiger auf ein Member der Klasse Class vom Typ Array aus 10 ints darstellt.



  • camper schrieb:

    Das geht nicht 😉

    Oops, ich wollte erst was mit void-Pointern machen und hab dann den Faden verloren 🙂



  • template<typename obj>
    class MenuEntryMethod : public MenuEntry
    {
        obj const& m_obj;  
        function m_fnptr;
    
    public:
        typedef void (obj::*function)();
        void operator()() { (m_obj.*m_fnptr)(); } 
    
        MenuEntryMethod(obj const& inst, function func, std::string const& name)
            : m_obj(inst), m_fnptr(func), MenuEntry(name)
        {}
    };
    

    würde ich es am ehesten logisch strukturieren. Aber zu Funktionszeigern guck einfach mal: www.function-pointer.org 🙂



  • @Bashar
    könntest du ein beispiel schreiben, wie du den type dann verwendest?



  • struct Class {
      int x[10], y[10];
    };
    Class a;
    
    typedef int (Class::*type)[10];
    
    type z = &Class::x;
    int i = (a.*z)[0];
    


  • ohje...und ich dachte schon, ich wäre halbwegs fit was cpp angeht :-0

    Aber das hier stimmt doch noch oder?

    namenlos schrieb:

    typedef void (Class::*Method)();
    

    "Method" ist der neue name: "void (Class::*)()" ist der alte datentyp: es ist eine funktion mit rückgabetyp void und ohne parameter.



  • Method ist dann eine Memberfunktion von Class mit Rückgabewert void und erwartet keine Parameter. Korrekt.



  • (D)Evil schrieb:

    Method ist dann eine Memberfunktion von Class mit Rückgabewert void und erwartet keine Parameter. Korrekt.

    *Klugsch... Modus on* Fast - Method ist ein Zeiger auf eine Memberfunktion 😉


Anmelden zum Antworten