#include <iostream>

template<class T, class V>
class GetterSetter
{
 private:
  typedef V& (T::*Setter)(const V&);
  typedef V  (T::*Getter)();

  T* ptr;
  Setter setter;
  Getter getter;

 public:
  GetterSetter(T* t, const Setter& setter_, const Getter& getter_)
    : ptr(t), setter(setter_), getter(getter_)
    {}
  
  const V& operator=(const V& v) {
    return ((*ptr).*setter)(v);
  }

  operator V() const { 
    return ((*ptr).*getter)(); 
  }
};

struct MyClass
{
  int bla_;
  GetterSetter<MyClass, int> bla;

  int& set_bla(const int& i) { 
    std::cout << "calling set_bla" << std::endl;
    return bla_ = i; 
  }
  int  get_bla()      { 
    std::cout << "calling get_bla" << std::endl;
    return bla_; 
  }

  MyClass() 
    : bla_(0), bla(this, &MyClass::set_bla, &MyClass::get_bla)
  {
  }
};

int main()
{
  MyClass a;
  a.bla = 5;
  std::cout << a.bla << std::endl;
}

/* EOF */



