struct TR 
{
  int a;
  int b;
  int c;
};

template<class T> struct D : public T
{
  
  D(const T &tt) : T(tt) {};
  
  template<class X> struct TA : public T {
    X a;
    TA(const T &t,const X& x) : T(t), a(x) {};
  };
  
  template<class X> D<TA<X> > setA(const X &x) {
    return D<TA<X> >(TA<X>(*this,x));
  }

  template<class X> struct TB : public T {
    X b;
    TB(const T &t,const X& x) : T(t), b(x) {};
  };

  template<class X> D<TB<X> > setB(const X &x) {
    return D<TB<X> >(TB<X>(*this,x));
  }

  template<class X> struct TC : public T {
    X c;
    TC(const T &t,const X& x) : T(t), c(x) {};
  };

  template<class X> D<TC<X> > setC(const X &x) {
    return D<TC<X> >(TC<X>(*this,x));
  }
  ~D()
  {
    //Itt csinalunk valamit
  }
};

D<TR> d() 
{
  return D<TR>(TR());
}

int main() 
{
  d();
  d().setA(5.5).setB(10).setC(1.5e12);
}
