fork download
  1. #include <type_traits>
  2. #include <iostream>
  3.  
  4. template <typename T>
  5. struct has_begin
  6. {
  7. typedef char (& yes)[1];
  8. typedef char (& no)[2];
  9.  
  10. template <typename U>
  11. static yes deduce(decltype(std::begin(std::declval<U const &>())) *);
  12. template <typename> static no deduce(...);
  13.  
  14. static bool constexpr value = sizeof(deduce<T>(0)) == sizeof(yes);
  15. };
  16.  
  17. template <typename Range>
  18. struct range_elem_i
  19. {
  20. typedef typename std::decay<
  21. decltype(*std::begin(std::declval<Range const &>()))
  22. >::type type;
  23. };
  24. template <typename T> using range_elem = typename range_elem_i<T>::type;
  25.  
  26. template <
  27. typename Range,
  28. typename = typename std::enable_if<has_begin<Range>::value>::type
  29. >
  30. int count(Range const & range, range_elem<Range> value)
  31. {
  32. int n = 0;
  33. for(auto const & e : range) if(e==value) ++n;
  34. return n;
  35. }
  36.  
  37. struct S {};
  38.  
  39. int count(S const & s, int) { return 10; }
  40.  
  41. int main()
  42. {
  43. int arr[] = { 1, 2, 2, 3 };
  44. std::cout << count(arr, 2) << '\n';
  45. S s;
  46. std::cout << count(s, 1) << '\n';
  47.  
  48. return 0;
  49. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
2
10