#include <iostream>

using namespace std;

template <typename T>
class Base
{
    public:
        T* t;
        void b() {}
};

class D1:
        public Base<D1>
{
    public:
        int d1;
};

class D2:
        public D1
{
    public:
        int d2;
};

template<template<typename> class Base, typename T>
struct IsAnyPublicBaseOf
{
  typedef char (&yes)[2];

  template<typename X>
  static yes Check (Base<X>*);
  static char Check (...);

  static const bool value = (sizeof(Check((T*)0)) == sizeof(yes));
};

template<bool> struct Bool;
template <typename T, typename = Bool<true> >
class Selector
{
public:
  template <typename U>
  void a(U& u)
  {
    cout << "a(U&)" << endl;
  }
};

template<typename T>
class Selector<T,Bool<IsAnyPublicBaseOf<Base,T>::value> >
{
public:
  template <typename U>
  void a(Base<U>& base)
  {
    cout << "a(Base<U>&)" << endl;
    base.b();
  }
};


int main()
{
    D2 derivated;
    Selector<D2> s;
    s.a(derivated);
    return 0;
}
