Typename von this



  • Hallo,
    ich probiere gerade den Typename einer anonymen Klasse zu bestimmen.

    class Class {
        struct /* Anonym */ {
        };
    };
    

    Dazu dachte ich mir, könnte man den Typename von this bestimmen und dann den Pointer durch Type Traits wegpfuschen. Wie ist das möglich?

    Danke 🙂



  • typename schrieb:

    Dazu dachte ich mir, könnte man den Typename von this bestimmen und dann den Pointer durch Type Traits wegpfuschen. Wie ist das möglich?

    Mit C++03 Standard: nicht dass ich wüsste. Vielleicht unterstützt dein Compiler irgendwelche non-standard typeof's. Ggf. geht auch mit C++0x ein decltype(*this) .



  • Jo, benutze GCC 4.6 und C++0x, auf die neuen "Features" kann man einfach nicht verzichten 🙂

    Ich möchte einen Code, der sich an den Standart hält. Also keine Ausflüge.

    typedef decltype(*this) ist eine gute Idee, führt aber zu:

    error: invalid use of ‘this’ at top level

    Generell beschwert sich der Compiler bei typedefs in Anonymous structs:

    error: ‘typedef std::string Class::<anonymous struct>::s’ invalid; an anonymous struct can only have non-static data members [-fpermissive]



  • In der anonymen Klasse selbst gibts kein *this. Dass ein anonymes struct kein ytpedef enthalten darf, ist mir nicht bewusst. Hab im Standard auch nichts passendes dazu gefunden, wobei "anonymous struct"/"anonymous class" dort garnicht vorkommt, nur "unnamed class", und da steht nur, das sie keine static data members enthalten dürfen. Ein typedef ist allerdings kein Datenmember.

    Zeig mal etwas mehr Code, vor allem die Stelle, wo du den typedef verwenden willst.



  • Ich möchte eine Klassentemplate bauen, die ermöglicht, dass auf Membervariablen direkt (z.B. durch den Zuweisungsoperator) zugegriffen werden kann. Als wenn sie public definiert wären. Trotzdem soll die "Host-Klasse" trotzdem Kontrolle über die Zugriffe haben, als wenn sie ihre eigenen get- und set-Methoden implementiert.

    Die Membervariable und ein View als Member werden in einer Union gemeinsam definiert damit die Speicheradresse von dem View die gleiche wie von der Membervariable ist. Dadurch kann der View-Member sich selber in die Union, in der er definiert wurde, casten und dann auf die Membervariable zugreifen.

    Ein paar Codezeilen sagen mehr als 1000 Worte:

    template <typename T, class Back, class Access>
    struct View {
        inline void operator=(const T& other) {
            Access::access();
            reinterpret_cast<Back*>(this)->data_ = v;
        }
    
        // Alle möglichen anderen operatoren sowie T& und const T& überladen und access Methode aufrufen
    };
    
    class PrintOnAccess {
        void access() {
            std::cout << "Access!" << std::endl;
        }
    };
    
    class Class {
        union {
            //typedef decltype(*this) ThisType; // Wäre schön
    
            float data_;
    
            View v<float, ThisType, PrintOnAccess>;
        };
    };
    


  • typename schrieb:

    ich probiere gerade den Typename einer anonymen Klasse zu bestimmen.

    class Class {
        struct /* Anonym */ {
        };
    };
    

    Wozu braucht man das? Gib dem Ding doch einen Namen. Wenn Du nicht möchtest, dass der Name außerhalb der Klasse und Klassenfreunde verwendet wird, lässt Du einfach die Definition im privaten Bereich.


Anmelden zum Antworten