Здравствуйте, Atomic Max, Вы писали:
AC>>Подсказка: зачем тебе указатель на реальный обьект, если с данными лежащими по этому указателю ты не работаешь?
AM>Видимо, я не понял подсказку. Поясните, пожалуйста.
Вот пример. Хоть он и не так изыскан как решения на шаблонах
#include <stdio.h>
#define PROPERTY(T,__type,__set,__get,__name) \
\
__type value() const { return resolve_(this,1)->__get(); } \
\
__type operator+() const { return value(); } \
\
operator __type () const { return value(); } \
\
void \
operator = (__type const& a) { resolve_(this,1)->__set(a); } \
\
template <class fake> static T* resolve_(const void* p,fake) {\
T* _ = 0; \
return (T*)( (char*)p - ( (char*)(&_->__name) - (char*)(_) ) );\
}
struct Obj1
{
void SetP1(int a) { printf("SetP1(%d)\n",a); }
int GetP1() const { printf("GetP1()\n"); return 0; }
void SetP2(int a) { printf("SetP2(%d)\n",a); }
int GetP2() const { printf("GetP2()\n"); return 0; }
//union { ещё одна причина не любить gcc,
struct __Property_a { PROPERTY(Obj1,int,SetP1,GetP1,a) } a;
struct __Property_b { PROPERTY(Obj1,int,SetP2,GetP2,b) } b;
//};
};
int main ()
{
Obj1 o;
printf("sizeof(Obj1) = %d\n",sizeof(Obj1));
o.a = 1;
printf("o.a + 1 = %d\n", o.a + 1);
o.b = 0;
printf("o.b + 1 = %d\n", o.b + 1);
return 0;
}