codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#define PROPERTY(Class,Name)\ class Property ## Name {\ public:\ Class* This() {\ union {\ Class* a;\ int b;\ } K;\ K.b=0;\ size_t offset=size_t(&K.a->Name)-size_t(K.a);\ return reinterpret_cast<Class*>(size_t(this)-offset);\ }\ };\ Property ## Name Name class PodClass { public: PROPERTY(PodClass,X); }; class ClassWithVirtualMember { public: virtual ~ClassWithVirtualMember() {} PROPERTY(ClassWithVirtualMember,Y); }; class ClassWithTrueVirtualMember { public: virtual void Test() {}; PROPERTY(ClassWithTrueVirtualMember,Z); }; class ClassWithMultipleProperties { public: virtual ~ClassWithMultipleProperties() {} PROPERTY(ClassWithMultipleProperties,A); PROPERTY(ClassWithMultipleProperties,B); ClassWithVirtualMember C; }; class ClassWithVirtualBase : virtual public ClassWithMultipleProperties { public: PROPERTY(ClassWithVirtualBase,D); }; class ClassWithVirtualBase2 : virtual public ClassWithMultipleProperties, public ClassWithTrueVirtualMember { public: PROPERTY(ClassWithVirtualBase2,E); }; class ClassWithBases : public ClassWithVirtualBase2, public ClassWithVirtualBase, public ClassWithVirtualMember { public: virtual void Test() {} PROPERTY(ClassWithBases,F); }; template<typename T> void Compare(T* a, T*b) { if(a!=b) std::cout << typeid(T).name() << " error: " << a << " " << b << std::endl; else std::cout << typeid(T).name() << " access of self() successfull" << std::endl; } int main() { PodClass a; Compare<PodClass>(&a,a.X.This()); ClassWithVirtualMember b; Compare<ClassWithVirtualMember>(&b,b.Y.This()); ClassWithBases c; Compare<ClassWithBases>(&c,c.F.This()); Compare<ClassWithVirtualBase2>(&c,c.E.This()); Compare<ClassWithMultipleProperties>(&c,c.A.This()); Compare<ClassWithMultipleProperties>(&c,c.B.This()); return 0; }
Private
[
?
]
Run code
Submit