fork(1) download
  1. #include <type_traits>
  2. #include <string>
  3.  
  4. #define VAL std::declval<T>()
  5.  
  6. #define DEF_TRAIT(name, expression) \
  7. template <typename, typename=void> struct name : std::false_type {}; \
  8. template <typename T> \
  9. struct name<T, decltype(void(expression))> : std::true_type {};
  10.  
  11. DEF_TRAIT(isDividable, VAL / VAL)
  12. DEF_TRAIT(isAddable, VAL + VAL)
  13.  
  14. template <typename T>
  15. struct myClass
  16. {
  17. static_assert( isAddable<T>{}, "T not addable!" );
  18. static_assert( isDividable<T>{}, "T not dividable!" );
  19. };
  20.  
  21. template class myClass<int>;
  22. template class myClass<std::string>; // Fails for isDividable
  23.  
  24.  
  25. int main() {}
  26.  
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:22:16:   required from here
prog.cpp:18:2: error: static assertion failed: T not dividable!
  static_assert( isDividable<T>{}, "T not dividable!" );
  ^
stdout
Standard output is empty