fork download
  1. #include <list>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. template <typename T>
  6. struct has_reserve {
  7. private:
  8. template <typename U>
  9. static auto test(U *t) -> decltype(t->reserve(0), std::true_type{});
  10.  
  11. template <typename>
  12. static std::false_type test(...);
  13.  
  14. public:
  15. static bool constexpr value = decltype(test<T>(nullptr))::value;
  16. };
  17.  
  18. template <typename T>
  19. typename std::enable_if<has_reserve<T>::value, void>::type
  20. reserve(T &object, typename T::size_type n) {
  21. return object.reserve(n);
  22. }
  23.  
  24. template <typename T>
  25. typename std::enable_if<!has_reserve<T>::value, void>::type
  26. reserve(T &, typename T::size_type) {}
  27.  
  28. int main() {
  29. std::vector<int> v;
  30. reserve(v, 3);
  31. v.push_back(1);
  32. v.push_back(2);
  33. v.push_back(3);
  34. for (auto i : v) std::cout << i << " ";
  35. std::cout << "\n";
  36.  
  37. std::list<int> l;
  38. reserve(l, 3);
  39. l.push_back(3);
  40. l.push_back(2);
  41. l.push_back(1);
  42. for (auto i : l) std::cout << i << " ";
  43. std::cout << "\n";
  44. }
Success #stdin #stdout 0s 3272KB
stdin
Standard input is empty
stdout
1 2 3 
3 2 1