1 // Origin: Ewgenij Gawrilow <gawrilow@math.TU-Berlin.DE> 2 3 extern "C" void abort (); 4 5 template <template <class X> class B, class A> 6 struct is_instance_of { 7 enum { answer=false }; 8 }; 9 10 template <template <class X> class B, class T> 11 struct is_instance_of<B, B<T> > { 12 enum { answer=true }; 13 }; 14 15 template <class X> struct C { }; 16 template <class X> struct D { }; 17 18 template <class T> 19 bool is_C (const T&) { 20 return is_instance_of<C,T>::answer; 21 }; 22 23 int main() { 24 if (!is_C(C<int>())) 25 abort (); 26 if (is_C(D<int>())) 27 abort (); 28 return 0; 29 } 30