fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <type_traits>
  5.  
  6. template <typename> struct is_pair : std::false_type {};
  7. template <typename T, typename U> struct is_pair<std::pair<T, U>> : std::true_type {};
  8.  
  9. namespace extract
  10. {
  11. template <typename Iter>
  12. auto
  13. e(Iter it)
  14. -> typename std::enable_if<is_pair<typename std::iterator_traits<Iter>::value_type>::value,
  15. decltype(it->second)>::type
  16. {
  17. return it->second;
  18. }
  19.  
  20. template <typename Iter>
  21. auto
  22. e(Iter it)
  23. -> typename std::enable_if<!is_pair<typename std::iterator_traits<Iter>::value_type>::value,
  24. decltype(*it)>::type
  25. {
  26. return *it;
  27. }
  28.  
  29. }
  30.  
  31. template<typename Iterator>
  32. void print(Iterator begin, Iterator end)
  33. {
  34. while (begin != end)
  35. {
  36. std::cout << extract::e(begin) << std::endl;
  37. ++begin;
  38. }
  39. }
  40.  
  41. int main()
  42. {
  43. std::vector<int> v(3, 1);
  44. std::map<int, int> m = {{0, 10}, {1, 11}, {2, 12}};
  45.  
  46. print(v.begin(), v.end());
  47. print(m.begin(), m.end());
  48.  
  49. return 0;
  50. }
  51.  
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
1
1
1
10
11
12