#include <iostream>
#include <type_traits>
struct UserType{};
struct LibType1{};
struct LibType2{};
namespace def {
struct NoOp {};
template <typename T>
NoOp operator ^ (T, LibType2)
{
static_assert(sizeof(T) == 0, "Don't do that.");
}
}
// try commenting this out
LibType1 operator ^ (UserType, LibType2)
{
return {};
}
void doIt(UserType ut)
{
using namespace def;
LibType2 lt2;
ut ^ lt2;
}
template <typename T>
bool exists()
{
using namespace def;
return !std::is_same<decltype(std::declval<T>() ^ std::declval<LibType2>()), NoOp>::value;
}
int
main(void)
{
std::cout << exists<UserType>() << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpzdHJ1Y3QgVXNlclR5cGV7fTsKc3RydWN0IExpYlR5cGUxe307CnN0cnVjdCBMaWJUeXBlMnt9OwoKbmFtZXNwYWNlIGRlZiB7CiAgICBzdHJ1Y3QgTm9PcCB7fTsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIE5vT3Agb3BlcmF0b3IgXiAoVCwgTGliVHlwZTIpCiAgICB7CiAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoVCkgPT0gMCwgIkRvbid0IGRvIHRoYXQuIik7CiAgICB9Cn0KCi8vIHRyeSBjb21tZW50aW5nIHRoaXMgb3V0CkxpYlR5cGUxIG9wZXJhdG9yIF4gKFVzZXJUeXBlLCBMaWJUeXBlMikKewogICAgcmV0dXJuIHt9Owp9Cgp2b2lkIGRvSXQoVXNlclR5cGUgdXQpCnsKICAgIHVzaW5nIG5hbWVzcGFjZSBkZWY7CiAgICBMaWJUeXBlMiBsdDI7CiAgICB1dCBeIGx0MjsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmJvb2wgZXhpc3RzKCkKewogICAgdXNpbmcgbmFtZXNwYWNlIGRlZjsKICAgIHJldHVybiAhc3RkOjppc19zYW1lPGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxUPigpIF4gc3RkOjpkZWNsdmFsPExpYlR5cGUyPigpKSwgTm9PcD46OnZhbHVlOwp9CgppbnQKbWFpbih2b2lkKQp7CiAgICBzdGQ6OmNvdXQgPDwgZXhpc3RzPFVzZXJUeXBlPigpIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9