fork download
  1.  
  2. #include <type_traits>
  3. #include <iostream>
  4.  
  5.  
  6. template <typename T>
  7. class is_int_or_float : public std::integral_constant<bool, std::is_same<T, int>::value || std::is_same<T, float>::value> {
  8. };
  9.  
  10.  
  11. template<typename T, typename Enable = void> //(2)
  12. struct Helper {
  13. static void go(const T&) {
  14. std::cout << "all"<< std::endl;
  15. }
  16. };
  17.  
  18. template<typename T>
  19. struct Helper<T, typename std::enable_if<is_int_or_float<T>::value>::type> { // (3)
  20. static void go(const T&) {
  21. std::cout << "int or float" << std::endl;
  22. }
  23. };
  24.  
  25. template<typename T>
  26. struct Helper<T, typename std::enable_if<std::is_pointer<T>::value>::type> { // (3)
  27. static void go(const T&) {
  28. std::cout << "pointer" << std::endl;
  29. }
  30. };
  31.  
  32. template<typename T>
  33. void func(const T& arg) {
  34. Helper<T>::go(arg); // (1)
  35. }
  36. int main() {
  37. char c;
  38. int i;
  39. float f;
  40. int* p;
  41. func(c);
  42. func(i);
  43. func(f);
  44. func(p);
  45. }
  46.  
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
all
int or float
int or float
pointer