src/work/alpar/named-param-test4.cc
changeset 1365 c280de819a73
parent 1105 6777f0b0e7b5
equal deleted inserted replaced
1:b6ffa217d5d5 -1:000000000000
     1 ///\file 
       
     2 ///Named template study
       
     3 
       
     4 ///\e
       
     5 
       
     6 ///\e
       
     7 ///
       
     8 class AlgorithmDefaultTypes 
       
     9 {
       
    10 public:
       
    11 ///\e
       
    12 
       
    13 ///\e
       
    14 ///
       
    15   typedef int Adat;
       
    16 };
       
    17 
       
    18 ///\e
       
    19 
       
    20 ///\e
       
    21 ///
       
    22 template<class T = AlgorithmDefaultTypes>
       
    23 class AlgorithmTypes : public T 
       
    24 {
       
    25 public:
       
    26 ///\e
       
    27 
       
    28 ///\e
       
    29 ///
       
    30   template<class X>
       
    31   class SetAdat : public T { X Adat; };
       
    32 };
       
    33 
       
    34 ///\e
       
    35 
       
    36 ///\e
       
    37 ///
       
    38 template<class T = AlgorithmTypes<> >
       
    39 class AlgorithmDefaultDataFields : public T
       
    40 {
       
    41 protected:
       
    42 ///\e
       
    43 
       
    44 ///\e
       
    45 ///
       
    46   typedef T TypeTraits; //Jo ez a nev?
       
    47 protected:
       
    48 ///\e
       
    49 
       
    50 ///\e
       
    51 ///
       
    52   typename T::Adat adat;
       
    53 };
       
    54 
       
    55 ///\e
       
    56 
       
    57 ///\e
       
    58 ///
       
    59 template<class T = AlgorithmDefaultDataFields<> >
       
    60 class Algorithm : public T
       
    61 {
       
    62   int _intAdat;
       
    63 public:
       
    64   Algorithm() {};
       
    65   Algorithm(const T &tt) : T(tt) {};
       
    66 
       
    67   template<class X> class _SetAdat : public T {
       
    68     protected:
       
    69     X adat;
       
    70     public:
       
    71     typedef X Adat;
       
    72     _SetAdat() {}; //"Algorithm<>::_SetAdat<double> b;"-hez kell!!!!
       
    73                    // De az is rossz!!!!!
       
    74     _SetAdat(const T &t,const X& x) : T(t), adat(x) {};
       
    75   };
       
    76   
       
    77  ///\name Funtion Named Parameters
       
    78   
       
    79   ///@{
       
    80 
       
    81   ///\e
       
    82   
       
    83   ///\e
       
    84   ///
       
    85   template<class X>
       
    86   Algorithm<_SetAdat<X> > setAdat(const X &x) {
       
    87     return Algorithm<_SetAdat<X> >(_SetAdat<X>(*this,x));
       
    88   }
       
    89 
       
    90   ///@}
       
    91   ///\name Named Parameters
       
    92   
       
    93   ///@{
       
    94 
       
    95   ///\e
       
    96   
       
    97   ///\e
       
    98   ///
       
    99   template<class X>
       
   100   class SetAdat :
       
   101     public Algorithm<AlgorithmDefaultDataFields<
       
   102     typename T::TypeTraits::template SetAdat<X> > >
       
   103   {};
       
   104   
       
   105   ///@}  
       
   106 
       
   107 ///\e
       
   108 
       
   109 ///\e
       
   110 ///
       
   111   Algorithm &setIntAdat(int i) {_intAdat=i;return *this;}
       
   112   //vagy:
       
   113 ///Vagy
       
   114 
       
   115 ///Vagy...
       
   116 ///
       
   117   Algorithm &intAdat(int i) {_intAdat=i;return *this;}
       
   118   
       
   119   //Maga az algoritmus!!!!!!!
       
   120 ///\e
       
   121 
       
   122 ///\e
       
   123 ///
       
   124   typename T::Adat run()
       
   125   {
       
   126     //Itt csinalunk valamit
       
   127     return adat;    
       
   128   }
       
   129 
       
   130   ~Algorithm()
       
   131   {
       
   132     //Itt nem csinalunk semmit
       
   133   }
       
   134 };
       
   135 
       
   136 ///\e
       
   137 
       
   138 ///\e
       
   139 ///
       
   140 Algorithm<> algorithm() 
       
   141 {
       
   142   return Algorithm<>();
       
   143 }
       
   144 
       
   145 int main() 
       
   146 {
       
   147   Algorithm<> a;
       
   148   a.run();
       
   149 
       
   150 //   Algorithm<>::_SetAdat<double> b; b=b;//Ez itt nem az, amit szeretnenk!!! 
       
   151 //   //  b.run();
       
   152   
       
   153   Algorithm<>::SetAdat<double> c; //Algorithm<>::Adat<double> c; jobb vo'na
       
   154   c.run();
       
   155 
       
   156   algorithm().run();
       
   157   algorithm().setAdat(5.2).run();
       
   158 }