deba@1036: #include deba@1036: deba@1036: using namespace std; deba@1036: deba@1036: deba@1036: struct _EmptyList { deba@1036: void write() const {} deba@1036: }; deba@1036: deba@1036: template deba@1036: struct _AddNode { deba@1036: typedef _Next Next; deba@1036: typedef _Item Item; deba@1036: deba@1036: const Item item; deba@1036: const Next& next; deba@1036: deba@1036: _AddNode(const Item& _item, const Next& _next) deba@1036: : item(_item), next(_next) {} deba@1036: deba@1036: void write() const { deba@1036: next.write(); deba@1036: cout << item << ' '; deba@1036: } deba@1036: }; deba@1036: deba@1036: template deba@1036: struct _Writer { deba@1036: typedef _List List; deba@1036: deba@1036: const List list; deba@1036: deba@1036: _Writer(const List& _list = List()) : list(_list) {} deba@1036: deba@1036: deba@1036: template _Writer<_AddNode > add(Item item) const { deba@1036: return _Writer<_AddNode >(_AddNode(item, list)); deba@1036: } deba@1036: deba@1036: void write() const { deba@1036: list.write(); deba@1036: cout << endl; deba@1036: } deba@1036: }; deba@1036: deba@1036: deba@1036: typedef _Writer<> Writer; deba@1036: deba@1036: int main() { deba@1036: Writer().add(3).add("alpha").add(4.53).write(); deba@1036: }