fork download
  1. #include <iterator>
  2. #include <type_traits>
  3. #include <iostream>
  4. #include <vector>
  5. #include <list>
  6.  
  7. template<typename T>
  8. typename
  9. std::enable_if<
  10. std::is_same<
  11. typename T::iterator_category,
  12. std::bidirectional_iterator_tag
  13. >::value,
  14. T
  15. >::type
  16. foo(T it)
  17. {
  18. std::cout << "bidirectional\n";
  19. return it;
  20. }
  21.  
  22. template<typename T>
  23. typename
  24. std::enable_if<
  25. std::is_same<
  26. typename T::iterator_category,
  27. std::random_access_iterator_tag
  28. >::value,
  29. T
  30. >::type
  31. foo(T it)
  32. {
  33. std::cout << "random access\n";
  34. return it;
  35. }
  36.  
  37. template<typename T>
  38. T* foo(T* it)
  39. {
  40. std::cout << "pointer\n";
  41. return it;
  42. }
  43.  
  44. int main()
  45. {
  46. std::list<int>::iterator it1;
  47. std::vector<int>::iterator it2;
  48. int* it3;
  49. std::istream_iterator<int> it4;
  50. foo(it1);
  51. foo(it2);
  52. foo(it3);
  53. //foo(it4); // this one doesn't compile
  54. }
  55.  
  56.  
Success #stdin #stdout 0s 2928KB
stdin
Standard input is empty
stdout
bidirectional
random access
pointer