| author | jacint | 
| Tue, 29 Mar 2005 07:35:09 +0000 | |
| changeset 1270 | 806451fd084b | 
| permissions | -rw-r--r-- | 
| alpar@1001 | 1  | 
// -*- mode:C++ -*-  | 
| alpar@1001 | 2  | 
|
| alpar@1001 | 3  | 
//////////////////////////////////////////////////////////////////////  | 
| alpar@1001 | 4  | 
// Named "function" parameters  | 
| alpar@1001 | 5  | 
//////////////////////////////////////////////////////////////////////  | 
| alpar@1001 | 6  | 
|
| alpar@1001 | 7  | 
class named_fn  | 
| alpar@1001 | 8  | 
{
 | 
| alpar@1001 | 9  | 
int _id;  | 
| alpar@1001 | 10  | 
double _val;  | 
| alpar@1001 | 11  | 
int _dim;  | 
| alpar@1001 | 12  | 
|
| alpar@1001 | 13  | 
public:  | 
| alpar@1001 | 14  | 
  named_fn() : _id(0), _val(1), _dim(2) {}
 | 
| alpar@1001 | 15  | 
  named_fn& id(int p)     { _id  = p ; return *this; }
 | 
| alpar@1001 | 16  | 
  named_fn& val(double p) { _val = p ; return *this; }
 | 
| alpar@1001 | 17  | 
  named_fn& dim(int p)    { _dim = p ; return *this; }
 | 
| alpar@1001 | 18  | 
|
| alpar@1001 | 19  | 
  ~named_fn() {
 | 
| alpar@1001 | 20  | 
//Itt van maga az algoritmus  | 
| alpar@1001 | 21  | 
}  | 
| alpar@1001 | 22  | 
};  | 
| alpar@1001 | 23  | 
|
| alpar@1001 | 24  | 
//Hasznalat:  | 
| alpar@1001 | 25  | 
//named_fn().id(3);  | 
| alpar@1001 | 26  | 
//named_fn().id(3).val(2);  | 
| alpar@1001 | 27  | 
//named_fn().dim(4).id(3);  | 
| alpar@1001 | 28  | 
|
| alpar@1001 | 29  | 
|
| alpar@1001 | 30  | 
//////////////////////////////////////////////////////////////////////  | 
| alpar@1001 | 31  | 
// Named class template parameters (A)  | 
| alpar@1001 | 32  | 
//////////////////////////////////////////////////////////////////////  | 
| alpar@1001 | 33  | 
|
| alpar@1001 | 34  | 
template<class A=int,class B=double>  | 
| alpar@1001 | 35  | 
class Named_T  | 
| alpar@1001 | 36  | 
{
 | 
| alpar@1001 | 37  | 
public:  | 
| alpar@1001 | 38  | 
|
| alpar@1001 | 39  | 
typedef A Atype;  | 
| alpar@1001 | 40  | 
typedef B Btype;  | 
| alpar@1001 | 41  | 
|
| alpar@1001 | 42  | 
  template <class T> class SetAType : public Named_T<T,Btype> { };
 | 
| alpar@1001 | 43  | 
  template <class T> class SetBType : public Named_T<Atype,T> { };
 | 
| alpar@1001 | 44  | 
};  | 
| alpar@1001 | 45  | 
|
| alpar@1001 | 46  | 
// Named_T<>::SetAType<double>::SetBType<double>  | 
| alpar@1001 | 47  | 
|
| alpar@1001 | 48  | 
//////////////////////////////////////////////////////////////////////  | 
| alpar@1001 | 49  | 
// Named class template parameters (A)  | 
| alpar@1001 | 50  | 
//////////////////////////////////////////////////////////////////////  | 
| alpar@1001 | 51  | 
|
| alpar@1001 | 52  | 
struct _NTR  | 
| alpar@1001 | 53  | 
{
 | 
| alpar@1001 | 54  | 
typedef int Atype;  | 
| alpar@1001 | 55  | 
typedef double Btype;  | 
| alpar@1001 | 56  | 
};  | 
| alpar@1001 | 57  | 
|
| alpar@1001 | 58  | 
template<class TR=_NTR>  | 
| alpar@1001 | 59  | 
class Named_TR  | 
| alpar@1001 | 60  | 
{
 | 
| alpar@1001 | 61  | 
public:  | 
| alpar@1001 | 62  | 
|
| alpar@1001 | 63  | 
typedef typename TR::Atype Atype;  | 
| alpar@1001 | 64  | 
typedef typename TR::Btype Btype;  | 
| alpar@1001 | 65  | 
|
| alpar@1001 | 66  | 
Atype a;  | 
| alpar@1001 | 67  | 
Btype b;  | 
| alpar@1001 | 68  | 
|
| alpar@1001 | 69  | 
template <class T>  | 
| alpar@1001 | 70  | 
  struct ATR : public TR {
 | 
| alpar@1001 | 71  | 
typedef T Atype;  | 
| alpar@1001 | 72  | 
};  | 
| alpar@1001 | 73  | 
|
| alpar@1001 | 74  | 
template <class T>  | 
| alpar@1001 | 75  | 
  class SetAType : public Named_TR<ATR<T> > { };
 | 
| alpar@1001 | 76  | 
|
| alpar@1001 | 77  | 
template <class T>  | 
| alpar@1001 | 78  | 
  struct BTR : public TR {
 | 
| alpar@1001 | 79  | 
typedef T Btype;  | 
| alpar@1001 | 80  | 
};  | 
| alpar@1001 | 81  | 
template <class T>  | 
| alpar@1001 | 82  | 
  class SetBType : public Named_TR<BTR<T> > { };
 | 
| alpar@1001 | 83  | 
|
| alpar@1001 | 84  | 
  Named_TR() {};
 | 
| alpar@1001 | 85  | 
  Named_TR<TR> &setA(Atype _a) { a=_a; return *this;}
 | 
| alpar@1001 | 86  | 
  Named_TR<TR> &setB(Btype _b) { b=_b; return *this;}
 | 
| alpar@1001 | 87  | 
|
| alpar@1001 | 88  | 
  void run() {
 | 
| alpar@1001 | 89  | 
// itt az algoritmus  | 
| alpar@1001 | 90  | 
}  | 
| alpar@1001 | 91  | 
|
| alpar@1001 | 92  | 
//////////////////////////////////////////////////////////////////////  | 
| alpar@1001 | 93  | 
template<class T>  | 
| alpar@1001 | 94  | 
  SetAType<T> SETA(T t) { SetAType<T> r; r.a=t; r.b=b; return r;}
 | 
| alpar@1001 | 95  | 
template<class T>  | 
| alpar@1001 | 96  | 
  SetBType<T> SETB(T t) { SetBType<T> r; r.a=a; r.b=t; return r;}
 | 
| alpar@1001 | 97  | 
};  | 
| alpar@1001 | 98  | 
|
| alpar@1001 | 99  | 
// Hasznalat:  | 
| alpar@1001 | 100  | 
// 1.  | 
| alpar@1001 | 101  | 
// Named_TR<>::SetAType<double> nt;  | 
| alpar@1001 | 102  | 
// Named_TR<>::SetBType<double>::SetAType<double> nt2;  | 
| alpar@1001 | 103  | 
// nt2.setA(5).setB(6).run();  | 
| alpar@1001 | 104  | 
// 2.  | 
| alpar@1001 | 105  | 
// double x;  | 
| alpar@1001 | 106  | 
// Named_TR<>().SETA(5.2).SETB(x).run();  | 
| alpar@1001 | 107  | 
// 3.  | 
| alpar@1001 | 108  | 
//   struct MyTr : public _NTR { typedef float Btype; };
 | 
| alpar@1001 | 109  | 
// int main()  | 
| alpar@1001 | 110  | 
//   {
 | 
| alpar@1001 | 111  | 
// Named_TR<MyTr> d2; d2=d2;  | 
| alpar@1001 | 112  | 
// }  | 
| alpar@1001 | 113  | 
|
| alpar@1001 | 114  | 
|
| alpar@1001 | 115  | 
// Sajnos ezt csak a fuggvenyen kivul lehet deklaralni:  | 
| alpar@1001 | 116  | 
struct MyTr : public _NTR { typedef float Btype; };
 | 
| alpar@1001 | 117  | 
|
| alpar@1001 | 118  | 
typedef Named_T<> Named_TN;  | 
| alpar@1001 | 119  | 
|
| alpar@1001 | 120  | 
int main()  | 
| alpar@1001 | 121  | 
{
 | 
| alpar@1001 | 122  | 
|
| alpar@1001 | 123  | 
Named_T<> a;a=a;  | 
| alpar@1001 | 124  | 
Named_T<>::SetAType<double> b;b=b;  | 
| alpar@1001 | 125  | 
Named_T<>::SetAType<double>::SetBType<int> c;c=c;  | 
| alpar@1001 | 126  | 
|
| alpar@1001 | 127  | 
Named_TR<> a2;a2=a2;  | 
| alpar@1001 | 128  | 
Named_TR<>::SetAType<double> b2;b2=b2;  | 
| alpar@1001 | 129  | 
Named_TR<>::SetAType<double>::SetBType<int> c2;c2=c2;  | 
| alpar@1001 | 130  | 
|
| alpar@1001 | 131  | 
//De igy is lehet:  | 
| alpar@1001 | 132  | 
Named_TR<MyTr> d2; d2=d2;  | 
| alpar@1001 | 133  | 
|
| alpar@1001 | 134  | 
named_fn().id(3);  | 
| alpar@1001 | 135  | 
named_fn().id(3).val(2);  | 
| alpar@1001 | 136  | 
named_fn().dim(4).id(3);  | 
| alpar@1001 | 137  | 
|
| alpar@1001 | 138  | 
Named_TR<>::SetAType<double> nt;  | 
| alpar@1001 | 139  | 
Named_TR<>::SetBType<double>::SetAType<double> nt2;  | 
| alpar@1001 | 140  | 
nt2.setA(5).setB(6).run();  | 
| alpar@1001 | 141  | 
|
| alpar@1001 | 142  | 
double x;  | 
| alpar@1001 | 143  | 
Named_TR<>().SETA(5.2).SETB(x).run();  | 
| alpar@1001 | 144  | 
}  | 
| alpar@1001 | 145  |