alpar@1052: struct TR 
alpar@1052: {
alpar@1052:   int a;
alpar@1052:   int b;
alpar@1052:   int c;
alpar@1052: };
alpar@1052: 
alpar@1052: template<class T> struct D : public T
alpar@1052: {
alpar@1052:   
alpar@1052:   D(const T &tt) : T(tt) {};
alpar@1052:   
alpar@1052:   template<class X> struct TA : public T {
alpar@1052:     X a;
alpar@1052:     TA(const T &t,const X& x) : T(t), a(x) {};
alpar@1052:   };
alpar@1052:   
alpar@1052:   template<class X> D<TA<X> > setA(const X &x) {
alpar@1052:     return D<TA<X> >(TA<X>(*this,x));
alpar@1052:   }
alpar@1052: 
alpar@1052:   template<class X> struct TB : public T {
alpar@1052:     X b;
alpar@1052:     TB(const T &t,const X& x) : T(t), b(x) {};
alpar@1052:   };
alpar@1052: 
alpar@1052:   template<class X> D<TB<X> > setB(const X &x) {
alpar@1052:     return D<TB<X> >(TB<X>(*this,x));
alpar@1052:   }
alpar@1052: 
alpar@1052:   template<class X> struct TC : public T {
alpar@1052:     X c;
alpar@1052:     TC(const T &t,const X& x) : T(t), c(x) {};
alpar@1052:   };
alpar@1052: 
alpar@1052:   template<class X> D<TC<X> > setC(const X &x) {
alpar@1052:     return D<TC<X> >(TC<X>(*this,x));
alpar@1052:   }
alpar@1052:   ~D()
alpar@1052:   {
alpar@1052:     //Itt csinalunk valamit
alpar@1052:   }
alpar@1052: };
alpar@1052: 
alpar@1052: D<TR> d() 
alpar@1052: {
alpar@1052:   return D<TR>(TR());
alpar@1052: }
alpar@1052: 
alpar@1052: int main() 
alpar@1052: {
alpar@1052:   d();
alpar@1052:   d().setA(5.5).setB(10).setC(1.5e12);
alpar@1052: }