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