alpar@1001: // -*- mode:C++ -*- alpar@1001: alpar@1001: ////////////////////////////////////////////////////////////////////// alpar@1001: // Named "function" parameters alpar@1001: ////////////////////////////////////////////////////////////////////// alpar@1001: alpar@1001: class named_fn alpar@1001: { alpar@1001: int _id; alpar@1001: double _val; alpar@1001: int _dim; alpar@1001: alpar@1001: public: alpar@1001: named_fn() : _id(0), _val(1), _dim(2) {} alpar@1001: named_fn& id(int p) { _id = p ; return *this; } alpar@1001: named_fn& val(double p) { _val = p ; return *this; } alpar@1001: named_fn& dim(int p) { _dim = p ; return *this; } alpar@1001: alpar@1001: ~named_fn() { alpar@1001: //Itt van maga az algoritmus alpar@1001: } alpar@1001: }; alpar@1001: alpar@1001: //Hasznalat: alpar@1001: //named_fn().id(3); alpar@1001: //named_fn().id(3).val(2); alpar@1001: //named_fn().dim(4).id(3); alpar@1001: alpar@1001: alpar@1001: ////////////////////////////////////////////////////////////////////// alpar@1001: // Named class template parameters (A) alpar@1001: ////////////////////////////////////////////////////////////////////// alpar@1001: alpar@1001: template alpar@1001: class Named_T alpar@1001: { alpar@1001: public: alpar@1001: alpar@1001: typedef A Atype; alpar@1001: typedef B Btype; alpar@1001: alpar@1001: template class SetAType : public Named_T { }; alpar@1001: template class SetBType : public Named_T { }; alpar@1001: }; alpar@1001: alpar@1001: // Named_T<>::SetAType::SetBType alpar@1001: alpar@1001: ////////////////////////////////////////////////////////////////////// alpar@1001: // Named class template parameters (A) alpar@1001: ////////////////////////////////////////////////////////////////////// alpar@1001: alpar@1001: struct _NTR alpar@1001: { alpar@1001: typedef int Atype; alpar@1001: typedef double Btype; alpar@1001: }; alpar@1001: alpar@1001: template alpar@1001: class Named_TR alpar@1001: { alpar@1001: public: alpar@1001: alpar@1001: typedef typename TR::Atype Atype; alpar@1001: typedef typename TR::Btype Btype; alpar@1001: alpar@1001: Atype a; alpar@1001: Btype b; alpar@1001: alpar@1001: template alpar@1001: struct ATR : public TR { alpar@1001: typedef T Atype; alpar@1001: }; alpar@1001: alpar@1001: template alpar@1001: class SetAType : public Named_TR > { }; alpar@1001: alpar@1001: template alpar@1001: struct BTR : public TR { alpar@1001: typedef T Btype; alpar@1001: }; alpar@1001: template alpar@1001: class SetBType : public Named_TR > { }; alpar@1001: alpar@1001: Named_TR() {}; alpar@1001: Named_TR &setA(Atype _a) { a=_a; return *this;} alpar@1001: Named_TR &setB(Btype _b) { b=_b; return *this;} alpar@1001: alpar@1001: void run() { alpar@1001: // itt az algoritmus alpar@1001: } alpar@1001: alpar@1001: ////////////////////////////////////////////////////////////////////// alpar@1001: template alpar@1001: SetAType SETA(T t) { SetAType r; r.a=t; r.b=b; return r;} alpar@1001: template alpar@1001: SetBType SETB(T t) { SetBType r; r.a=a; r.b=t; return r;} alpar@1001: }; alpar@1001: alpar@1001: // Hasznalat: alpar@1001: // 1. alpar@1001: // Named_TR<>::SetAType nt; alpar@1001: // Named_TR<>::SetBType::SetAType nt2; alpar@1001: // nt2.setA(5).setB(6).run(); alpar@1001: // 2. alpar@1001: // double x; alpar@1001: // Named_TR<>().SETA(5.2).SETB(x).run(); alpar@1001: // 3. alpar@1001: // struct MyTr : public _NTR { typedef float Btype; }; alpar@1001: // int main() alpar@1001: // { alpar@1001: // Named_TR d2; d2=d2; alpar@1001: // } alpar@1001: alpar@1001: alpar@1001: // Sajnos ezt csak a fuggvenyen kivul lehet deklaralni: alpar@1001: struct MyTr : public _NTR { typedef float Btype; }; alpar@1001: alpar@1001: typedef Named_T<> Named_TN; alpar@1001: alpar@1001: int main() alpar@1001: { alpar@1001: alpar@1001: Named_T<> a;a=a; alpar@1001: Named_T<>::SetAType b;b=b; alpar@1001: Named_T<>::SetAType::SetBType c;c=c; alpar@1001: alpar@1001: Named_TR<> a2;a2=a2; alpar@1001: Named_TR<>::SetAType b2;b2=b2; alpar@1001: Named_TR<>::SetAType::SetBType c2;c2=c2; alpar@1001: alpar@1001: //De igy is lehet: alpar@1001: Named_TR d2; d2=d2; alpar@1001: alpar@1001: named_fn().id(3); alpar@1001: named_fn().id(3).val(2); alpar@1001: named_fn().dim(4).id(3); alpar@1001: alpar@1001: Named_TR<>::SetAType nt; alpar@1001: Named_TR<>::SetBType::SetAType nt2; alpar@1001: nt2.setA(5).setB(6).run(); alpar@1001: alpar@1001: double x; alpar@1001: Named_TR<>().SETA(5.2).SETB(x).run(); alpar@1001: } alpar@1001: