#include <list>
#include <iostream>
#include <vector>

template <typename T>
struct has_reserve {
 private:
  template <typename U>
  static auto test(U *t) -> decltype(t->reserve(0), std::true_type{});

  template <typename>
  static std::false_type test(...);

 public:
  static bool constexpr value = decltype(test<T>(nullptr))::value;
};

template <typename T>
typename std::enable_if<has_reserve<T>::value, void>::type
reserve(T &object, typename T::size_type n) {
  return object.reserve(n);
}

template <typename T>
typename std::enable_if<!has_reserve<T>::value, void>::type
reserve(T &, typename T::size_type) {}
    
int main() {
  std::vector<int> v;
  reserve(v, 3);
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  for (auto i : v) std::cout << i << " ";
  std::cout << "\n";
  
  std::list<int> l;
  reserve(l, 3);
  l.push_back(3);
  l.push_back(2);
  l.push_back(1);
  for (auto i : l) std::cout << i << " ";
  std::cout << "\n";
}