#include <iostream>
#include <type_traits>
#define P(x) std::cout<<x<<std::endl

struct A {};
struct B {};

struct Yoba {
	template<typename T>
	using remove_cvr_t = std::remove_reference_t<std::remove_cv_t<T>>;

	template<typename T, typename T1>
	using cmp_type_t = std::enable_if_t<std::is_same<remove_cvr_t<T>, remove_cvr_t<T1>>::value, T>;

	template<typename R, typename T>
	cmp_type_t<R, A>
	inline create(T &&p) {
		std::cout << "A SFINAE overload: " << p << std::endl;
	}
	
	template<typename R, typename T>
	cmp_type_t<R, B>
	inline create(T &&p) {
		std::cout << "B SFINAE overload: " << p << std::endl;
	}
};

int main()
{
   Yoba y;
   y.create<A>(1);
   y.create<B>("ASS");
}