[ create a new paste ] login | about

Link: http://codepad.org/xDx64zRE    [ raw code | output | fork ]

burbelgruff - C++, pasted on Oct 21:
#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;
}


Output:
1
2
3
4
5
6
8PodClass access of self() successfull
22ClassWithVirtualMember access of self() successfull
14ClassWithBases access of self() successfull
21ClassWithVirtualBase2 access of self() successfull
27ClassWithMultipleProperties access of self() successfull
27ClassWithMultipleProperties access of self() successfull


Create a new paste based on this one


Comments: