fork download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. namespace details
  5. {
  6. template <typename T, typename R, typename = R>
  7. struct equality : std::false_type {};
  8.  
  9. template <typename T, typename R>
  10. struct equality<T, R, decltype(std::declval<T>() == std::declval<T>())> : std::true_type {};
  11. }
  12.  
  13. template<typename T, typename R = bool>
  14. struct equality : details::equality<T, R> {};
  15.  
  16. struct A {};
  17. struct B { bool operator == (B const &); };
  18. struct C { short operator == (C const &); };
  19. struct D { bool operator == (short); };
  20.  
  21. int main()
  22. {
  23. std::cout<< "equality<A>::value = " << equality<A>::value << std::endl;
  24. std::cout<< "equality<B>::value = " << equality<B>::value << std::endl;
  25. std::cout<< "equality<C>::value = " << equality<C>::value << std::endl;
  26. std::cout<< "equality<B,short>::value = " << equality<B,short>::value << std::endl;
  27. std::cout<< "equality<C,short>::value = " << equality<C,short>::value << std::endl;
  28. std::cout<< "equality<D>::value = " << equality<D>::value << "<====\n";
  29. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
equality<A>::value = 0
equality<B>::value = 1
equality<C>::value = 0
equality<B,short>::value = 0
equality<C,short>::value = 1
equality<D>::value = 0<====