fork download
  1. #include <type_traits>
  2. #include <string>
  3.  
  4. template <typename, typename=void>
  5. struct isAddable : std::false_type {};
  6.  
  7. template <typename T>
  8. struct isAddable<T, decltype(void(std::declval<T>() + std::declval<T>()))>
  9. : std::true_type {};
  10.  
  11. template <typename, typename=void>
  12. struct isDividable : std::false_type {};
  13.  
  14. template <typename T>
  15. struct isDividable<T, decltype(void(std::declval<T>() / std::declval<T>()))>
  16. : std::true_type {};
  17.  
  18. template <typename T>
  19. struct myClass
  20. {
  21. static_assert( isAddable<T>{}, "T not addable!" );
  22. static_assert( isDividable<T>{}, "T not dividable!" );
  23. };
  24.  
  25. template class myClass<int>;
  26. template class myClass<std::string>; // Fails for isDividable
  27.  
  28.  
  29. int main() {}
  30.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In instantiation of ‘class myClass<std::basic_string<char> >’:
prog.cpp:26:16:   required from here
prog.cpp:22:2: error: static assertion failed: T not dividable!
  static_assert( isDividable<T>{}, "T not dividable!" );
  ^
stdout
Standard output is empty