1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/src/work/alpar/named-param-test.cc Wed Nov 17 17:13:15 2004 +0000
1.3 @@ -0,0 +1,145 @@
1.4 +// -*- mode:C++ -*-
1.5 +
1.6 +//////////////////////////////////////////////////////////////////////
1.7 +// Named "function" parameters
1.8 +//////////////////////////////////////////////////////////////////////
1.9 +
1.10 +class named_fn
1.11 +{
1.12 + int _id;
1.13 + double _val;
1.14 + int _dim;
1.15 +
1.16 + public:
1.17 + named_fn() : _id(0), _val(1), _dim(2) {}
1.18 + named_fn& id(int p) { _id = p ; return *this; }
1.19 + named_fn& val(double p) { _val = p ; return *this; }
1.20 + named_fn& dim(int p) { _dim = p ; return *this; }
1.21 +
1.22 + ~named_fn() {
1.23 + //Itt van maga az algoritmus
1.24 + }
1.25 +};
1.26 +
1.27 +//Hasznalat:
1.28 +//named_fn().id(3);
1.29 +//named_fn().id(3).val(2);
1.30 +//named_fn().dim(4).id(3);
1.31 +
1.32 +
1.33 +//////////////////////////////////////////////////////////////////////
1.34 +// Named class template parameters (A)
1.35 +//////////////////////////////////////////////////////////////////////
1.36 +
1.37 +template<class A=int,class B=double>
1.38 +class Named_T
1.39 +{
1.40 +public:
1.41 +
1.42 + typedef A Atype;
1.43 + typedef B Btype;
1.44 +
1.45 + template <class T> class SetAType : public Named_T<T,Btype> { };
1.46 + template <class T> class SetBType : public Named_T<Atype,T> { };
1.47 +};
1.48 +
1.49 +// Named_T<>::SetAType<double>::SetBType<double>
1.50 +
1.51 +//////////////////////////////////////////////////////////////////////
1.52 +// Named class template parameters (A)
1.53 +//////////////////////////////////////////////////////////////////////
1.54 +
1.55 +struct _NTR
1.56 +{
1.57 + typedef int Atype;
1.58 + typedef double Btype;
1.59 +};
1.60 +
1.61 +template<class TR=_NTR>
1.62 +class Named_TR
1.63 +{
1.64 +public:
1.65 +
1.66 + typedef typename TR::Atype Atype;
1.67 + typedef typename TR::Btype Btype;
1.68 +
1.69 + Atype a;
1.70 + Btype b;
1.71 +
1.72 + template <class T>
1.73 + struct ATR : public TR {
1.74 + typedef T Atype;
1.75 + };
1.76 +
1.77 + template <class T>
1.78 + class SetAType : public Named_TR<ATR<T> > { };
1.79 +
1.80 + template <class T>
1.81 + struct BTR : public TR {
1.82 + typedef T Btype;
1.83 + };
1.84 + template <class T>
1.85 + class SetBType : public Named_TR<BTR<T> > { };
1.86 +
1.87 + Named_TR() {};
1.88 + Named_TR<TR> &setA(Atype _a) { a=_a; return *this;}
1.89 + Named_TR<TR> &setB(Btype _b) { b=_b; return *this;}
1.90 +
1.91 + void run() {
1.92 + // itt az algoritmus
1.93 + }
1.94 +
1.95 + //////////////////////////////////////////////////////////////////////
1.96 + template<class T>
1.97 + SetAType<T> SETA(T t) { SetAType<T> r; r.a=t; r.b=b; return r;}
1.98 + template<class T>
1.99 + SetBType<T> SETB(T t) { SetBType<T> r; r.a=a; r.b=t; return r;}
1.100 +};
1.101 +
1.102 +// Hasznalat:
1.103 +// 1.
1.104 +// Named_TR<>::SetAType<double> nt;
1.105 +// Named_TR<>::SetBType<double>::SetAType<double> nt2;
1.106 +// nt2.setA(5).setB(6).run();
1.107 +// 2.
1.108 +// double x;
1.109 +// Named_TR<>().SETA(5.2).SETB(x).run();
1.110 +// 3.
1.111 +// struct MyTr : public _NTR { typedef float Btype; };
1.112 +// int main()
1.113 +// {
1.114 +// Named_TR<MyTr> d2; d2=d2;
1.115 +// }
1.116 +
1.117 +
1.118 +// Sajnos ezt csak a fuggvenyen kivul lehet deklaralni:
1.119 +struct MyTr : public _NTR { typedef float Btype; };
1.120 +
1.121 +typedef Named_T<> Named_TN;
1.122 +
1.123 +int main()
1.124 +{
1.125 +
1.126 + Named_T<> a;a=a;
1.127 + Named_T<>::SetAType<double> b;b=b;
1.128 + Named_T<>::SetAType<double>::SetBType<int> c;c=c;
1.129 +
1.130 + Named_TR<> a2;a2=a2;
1.131 + Named_TR<>::SetAType<double> b2;b2=b2;
1.132 + Named_TR<>::SetAType<double>::SetBType<int> c2;c2=c2;
1.133 +
1.134 + //De igy is lehet:
1.135 + Named_TR<MyTr> d2; d2=d2;
1.136 +
1.137 + named_fn().id(3);
1.138 + named_fn().id(3).val(2);
1.139 + named_fn().dim(4).id(3);
1.140 +
1.141 + Named_TR<>::SetAType<double> nt;
1.142 + Named_TR<>::SetBType<double>::SetAType<double> nt2;
1.143 + nt2.setA(5).setB(6).run();
1.144 +
1.145 + double x;
1.146 + Named_TR<>().SETA(5.2).SETB(x).run();
1.147 +}
1.148 +