#include <iostream>

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

template<class A, class B, class extra = void /* Enable/disable specialization through SFINAE */>
class Class { public: void hello() {std::cout << "Base" << std::endl;} };

template<class B> class Class<A1, B> { public: void hello() {std::cout << "First" << std::endl;} };
template<class A> class Class<A, B1, typename std::enable_if<!std::is_same<A, A1>::value>::type> { 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;
}