#include <iostream>
using namespace std;

template <typename T, typename U>
struct BaseS
{
	virtual unsigned int operator()(T t, U u) const;
};

template <typename T, typename U>
struct S : BaseS<T,U>
{
	unsigned int operator()(T t, U u) const override
	{
		return 1;
	}
};

template <typename T>
struct S<T,nullptr_t> : BaseS<T,nullptr_t>
{
	virtual bool operator()(T t, nullptr_t u) const override
	{
		return 2;
	}
};

class A{};
class B{};

int main() {
	A a;
	B b;
	
	cout << S<A*,B*>()(&a,&b) << endl;
	cout << S<A*,nullptr_t>()(&a,nullptr) << endl;
	
	return 0;
}
