src/work/deba/test.cpp
changeset 1150 c20bcf71efe3
child 1210 f02396423239
equal deleted inserted replaced
-1:000000000000 0:05778cd51557
       
     1 #include <iostream>
       
     2 
       
     3 using namespace std;
       
     4 
       
     5 
       
     6 struct _EmptyList {
       
     7   void write() const {}
       
     8 };
       
     9 
       
    10 template <typename _Item, typename _Next>
       
    11 struct _AddNode {
       
    12   typedef _Next Next;
       
    13   typedef _Item Item;
       
    14   
       
    15   const Item item;
       
    16   const Next& next;
       
    17   
       
    18   _AddNode(const Item& _item, const Next& _next) 
       
    19     : item(_item), next(_next) {}
       
    20 
       
    21   void write() const {
       
    22     next.write();
       
    23     cout << item << ' ';
       
    24   }
       
    25 };
       
    26 
       
    27 template <typename _List = _EmptyList>
       
    28 struct _Writer {
       
    29   typedef _List List;
       
    30 
       
    31   const List list;
       
    32 
       
    33   _Writer(const List& _list = List()) : list(_list) {}
       
    34 
       
    35   
       
    36   template <typename Item> _Writer<_AddNode<Item, List> > add(Item item) const {
       
    37     return _Writer<_AddNode<Item, List> >(_AddNode<Item, List>(item, list));
       
    38   }
       
    39 
       
    40   void write() const {
       
    41     list.write();
       
    42     cout << endl;
       
    43   }
       
    44 };
       
    45 
       
    46 
       
    47 typedef _Writer<> Writer;
       
    48 
       
    49 int main() {
       
    50   Writer().add(3).add("alpha").add(4.53).write();
       
    51 }