fork download
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <vector>
  4.  
  5. template <typename T>
  6. auto is_iterator_impl(T* it)
  7. -> decltype(**it, ++(*it), (*it) == (*it), std::true_type());
  8.  
  9. template <typename T>
  10. auto is_iterator_impl(...) -> std::false_type;
  11.  
  12. template <typename T>
  13. using is_an_iterator = decltype(is_iterator_impl<T>(0));
  14.  
  15. template <class R>
  16. std::enable_if_t<!is_an_iterator<R>::value, int>
  17. make_ref(R& res) {
  18. std::cout << "Not an iterator\n";
  19. }
  20.  
  21. template <class R>
  22. std::enable_if_t<is_an_iterator<R>::value && !std::is_pointer<R>::value>
  23. make_ref(R& res) {
  24. std::cout << "An iterator\n";
  25. }
  26.  
  27. template <class R>
  28. std::enable_if_t<std::is_pointer<R>::value>
  29. make_ref(R& res) {
  30. std::cout << "A pointer\n";
  31. }
  32.  
  33. int main() {
  34. int i = 42;
  35. std::vector<int> v{4, 8, 15, 16, 23, 42};
  36. auto it = v.begin();
  37. const char* s = "hello";
  38. make_ref(i);
  39. make_ref(it);
  40. make_ref(s);
  41. }
Success #stdin #stdout 0s 3228KB
stdin
Standard input is empty
stdout
Not an iterator
An iterator
A pointer