fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. template<typename T>
  8. struct NotARef { typedef void type; };
  9. template<typename T>
  10. struct NotARef<T&> { }; // specialize for references, such that the type member doesn't exist.
  11.  
  12. template <class T>
  13. void foo(const T& )
  14. {cout << "void foo(const T&)" << endl;}
  15. template <class T, typename x = typename NotARef<T>::type >
  16. void foo(T&& ) // Now, thanks to NotARef, this will be called only for rvalues
  17. {cout << "void foo(T&&)" << endl;}
  18.  
  19. int main()
  20. {
  21. vector<int> x;
  22. foo(x); // Calls foo(const T&) as desired
  23. foo(vector<int>()); // void foo(T&&)
  24. }
  25.  
Success #stdin #stdout 0s 2896KB
stdin
Standard input is empty
stdout
void foo(const T&)
void foo(T&&)