src/work/alpar/named-param-test4.cc
author alpar
Fri, 08 Apr 2005 15:22:46 +0000
changeset 1327 ecc1cdea2ee7
parent 1105 6777f0b0e7b5
permissions -rw-r--r--
Disable shared libraries (makes the compilation a bit faster)
     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 }