#include <iostream>

class A {};
class B {};
class A1 {};
class B1 {};

template<class A, class B, bool AisA1 = std::is_same<A,A1>::value>
class Class { public: void hello() {std::cout << "Base" << std::endl;} };

template<class B> class Class<A1, B, true> { public: void hello() {std::cout << "First" << std::endl;} };
template<class A> class Class<A, B1, false> { public: void hello() {std::cout << "Second" << std::endl;} };

int main()
{
    
  Class<A1,B1> obj;// The first one is picked up
  obj.hello();
  Class<A,B1> obj2; // The second one is picked up
  obj2.hello();
  Class<A,B> obj3; // Base
  obj3.hello();
  
  return 0;
}