Re[4]: мысль
От: Alexey Chen Чили  
Дата: 18.02.05 18:27
Оценка: 1 (1)
Здравствуйте, 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.