fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <type_traits>
  4.  
  5. template<
  6. typename Iter,
  7. typename T = typename std::enable_if<
  8. std::is_arithmetic<typename std::iterator_traits<Iter>::value_type>::value,
  9. typename std::iterator_traits<Iter>::value_type
  10. >::type
  11. >
  12. T summer(Iter start, Iter end)
  13. {
  14. T sum{};
  15. for (auto it = start; it != end; it++)
  16. {
  17. sum += *it;
  18. }
  19. return sum;
  20. }
  21.  
  22. int main()
  23. {
  24. std::vector<double> vec {0.1, 0.2, 0.3}; // these are OK
  25. auto sum = summer(vec.begin(), vec.end());
  26. std::cout << sum << std::endl;
  27.  
  28. int arr[] = {1, 2, 3}; // these are OK
  29. auto sum2 = summer(arr, arr+3);
  30. std::cout << sum2 << std::endl;
  31.  
  32. std::vector<std::string> vec3 {"a", "b"}; // these are rejected
  33. auto sum3 = summer(vec3.begin(), vec3.end());
  34. std::cout << sum3 << std::endl;
  35.  
  36. return 0;
  37. }
Compilation error #stdin compilation error #stdout 0s 5432KB
stdin
Standard input is empty
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:33:48: error: no matching function for call to ‘summer(std::vector<std::__cxx11::basic_string<char> >::iterator, std::vector<std::__cxx11::basic_string<char> >::iterator)’
     auto sum3 = summer(vec3.begin(), vec3.end());
                                                ^
prog.cpp:12:3: note: candidate: ‘template<class Iter, class T> T summer(Iter, Iter)’
 T summer(Iter start, Iter end)
   ^~~~~~
prog.cpp:12:3: note:   template argument deduction/substitution failed:
prog.cpp:7:3: error: no type named ‘type’ in ‘struct std::enable_if<false, std::__cxx11::basic_string<char> >’
   typename T = typename std::enable_if<
   ^~~~~~~~
stdout
Standard output is empty