#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");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNkZWZpbmUgUCh4KSBzdGQ6OmNvdXQ8PHg8PHN0ZDo6ZW5kbAoKc3RydWN0IEEge307CnN0cnVjdCBCIHt9OwoKc3RydWN0IFlvYmEgewoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCXVzaW5nIHJlbW92ZV9jdnJfdCA9IHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PHN0ZDo6cmVtb3ZlX2N2X3Q8VD4+OwoKCXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQxPgoJdXNpbmcgY21wX3R5cGVfdCA9IHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPHJlbW92ZV9jdnJfdDxUPiwgcmVtb3ZlX2N2cl90PFQxPj46OnZhbHVlLCBUPjsKCgl0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUPgoJY21wX3R5cGVfdDxSLCBBPgoJaW5saW5lIGNyZWF0ZShUICYmcCkgewoJCXN0ZDo6Y291dCA8PCAiQSBTRklOQUUgb3ZlcmxvYWQ6ICIgPDwgcCA8PCBzdGQ6OmVuZGw7Cgl9CgkKCXRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+CgljbXBfdHlwZV90PFIsIEI+CglpbmxpbmUgY3JlYXRlKFQgJiZwKSB7CgkJc3RkOjpjb3V0IDw8ICJCIFNGSU5BRSBvdmVybG9hZDogIiA8PCBwIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCmludCBtYWluKCkKewogICBZb2JhIHk7CiAgIHkuY3JlYXRlPEE+KDEpOwogICB5LmNyZWF0ZTxCPigiQVNTIik7Cn0=