deba@1036: #include <iostream>
deba@1036: 
deba@1036: using namespace std;
deba@1036: 
deba@1210: #include <lemon/utility.h>
deba@1036: 
deba@1210: using namespace std;
deba@1210: /*
deba@1036: struct _EmptyList {
deba@1036:   void write() const {}
deba@1036: };
deba@1036: 
deba@1036: template <typename _Item, typename _Next>
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 <typename _List = _EmptyList>
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 <typename Item> _Writer<_AddNode<Item, List> > add(Item item) const {
deba@1036:     return _Writer<_AddNode<Item, List> >(_AddNode<Item, List>(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: }
deba@1210: */
deba@1210: 
deba@1210: class A {
deba@1210: public:
deba@1210:   typedef int X;
deba@1210: };
deba@1210: 
deba@1210: class C {
deba@1210: };
deba@1210: 
deba@1210: template <typename A> 
deba@1210: class TRUE {
deba@1210: public:
deba@1210:   static const bool state = true;
deba@1210: };
deba@1210: 
deba@1210: template <typename _A> 
deba@1210: class B {
deba@1210: public:
deba@1210:   typedef enable_if<A::X, int> state;
deba@1210: };
deba@1210: 
deba@1210: template <typename _A>
deba@1210: class B<_A, void> {
deba@1210: public:
deba@1210:   static const bool state = true;
deba@1210: };
deba@1210: 
deba@1210: int main() {
deba@1210:   printf("%s\n", B<A>::state(), true ? "true" : "false");
deba@1210:   printf("%s\n", B<C>::state(), true ? "true" : "false");
deba@1210:   return 0;
deba@1210: }