#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;
}