fork download
  1. #include <type_traits>
  2. #include <iostream>
  3.  
  4. template<class T>
  5. class has_addition
  6. {
  7. template <typename C> static std::true_type test( decltype(
  8. std::declval<C>() + std::declval<C>()
  9. )* );
  10. template <typename> static std::false_type test(...);
  11.  
  12. public:
  13. enum { value = decltype(test<T>(0))::value };
  14. };
  15.  
  16. template<class T>
  17. class X
  18. {
  19. public:
  20.  
  21. template <typename T1 = T>
  22. typename std::enable_if<!has_addition<T1>::value, void>::type use(T1 t)
  23. {
  24. std::cout << "without addition" << std::endl;
  25. T1 tt = t;
  26. }
  27.  
  28. template <typename T1 = T>
  29. typename std::enable_if<has_addition<T1>::value, void>::type use(T1 t)
  30. {
  31. std::cout << "with addition" << std::endl;
  32. auto tt = t + t;
  33. }
  34.  
  35. };
  36.  
  37. int main()
  38. {
  39. X<int> x1; x1.use(1);
  40. X<void*> x2; x2.use(nullptr);
  41. return 0;
  42. }
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
with addition
without addition