#include <iostream>
#include <type_traits>
#include <vector>
using namespace std;
template<typename T, typename = decltype(std::declval<T>() < std::declval<T>() )>
std::true_type supports_less_than_test(const T&);
std::false_type supports_less_than_test(...);
template<typename T>
struct has_less_than_operator : std::integral_constant<bool, std::is_same<std::true_type,
decltype(supports_less_than_test(std::declval<T>()))>::value> {};
struct foo
{
};
int main() {
std::vector<foo> obj;
std::cout << has_less_than_operator<decltype(obj)>::value << std::endl; // should return 0
//std::cout << (obj < obj) << std::endl; // compile error
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8VD4oKSA8IHN0ZDo6ZGVjbHZhbDxUPigpICk+IApzdGQ6OnRydWVfdHlwZSAgc3VwcG9ydHNfbGVzc190aGFuX3Rlc3QoY29uc3QgVCYpOwpzdGQ6OmZhbHNlX3R5cGUgc3VwcG9ydHNfbGVzc190aGFuX3Rlc3QoLi4uKTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBoYXNfbGVzc190aGFuX29wZXJhdG9yIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGQ6OmlzX3NhbWU8c3RkOjp0cnVlX3R5cGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoc3VwcG9ydHNfbGVzc190aGFuX3Rlc3Qoc3RkOjpkZWNsdmFsPFQ+KCkpKT46OnZhbHVlPiB7fTsKCnN0cnVjdCBmb28KewoJCn07CgppbnQgbWFpbigpIHsKCXN0ZDo6dmVjdG9yPGZvbz4gb2JqOwoJc3RkOjpjb3V0IDw8IGhhc19sZXNzX3RoYW5fb3BlcmF0b3I8ZGVjbHR5cGUob2JqKT46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsgLy8gc2hvdWxkIHJldHVybiAwCgkvL3N0ZDo6Y291dCA8PCAob2JqIDwgb2JqKSA8PCBzdGQ6OmVuZGw7IC8vIGNvbXBpbGUgZXJyb3IKCXJldHVybiAwOwp9