#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";
}
I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgaGFzX3Jlc2VydmUgewogcHJpdmF0ZToKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KICBzdGF0aWMgYXV0byB0ZXN0KFUgKnQpIC0+IGRlY2x0eXBlKHQtPnJlc2VydmUoMCksIHN0ZDo6dHJ1ZV90eXBle30pOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWU+CiAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSB0ZXN0KC4uLik7CgogcHVibGljOgogIHN0YXRpYyBib29sIGNvbnN0ZXhwciB2YWx1ZSA9IGRlY2x0eXBlKHRlc3Q8VD4obnVsbHB0cikpOjp2YWx1ZTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfcmVzZXJ2ZTxUPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCnJlc2VydmUoVCAmb2JqZWN0LCB0eXBlbmFtZSBUOjpzaXplX3R5cGUgbikgewogIHJldHVybiBvYmplY3QucmVzZXJ2ZShuKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFoYXNfcmVzZXJ2ZTxUPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCnJlc2VydmUoVCAmLCB0eXBlbmFtZSBUOjpzaXplX3R5cGUpIHt9CiAgICAKaW50IG1haW4oKSB7CiAgc3RkOjp2ZWN0b3I8aW50PiB2OwogIHJlc2VydmUodiwgMyk7CiAgdi5wdXNoX2JhY2soMSk7CiAgdi5wdXNoX2JhY2soMik7CiAgdi5wdXNoX2JhY2soMyk7CiAgZm9yIChhdXRvIGkgOiB2KSBzdGQ6OmNvdXQgPDwgaSA8PCAiICI7CiAgc3RkOjpjb3V0IDw8ICJcbiI7CiAgCiAgc3RkOjpsaXN0PGludD4gbDsKICByZXNlcnZlKGwsIDMpOwogIGwucHVzaF9iYWNrKDMpOwogIGwucHVzaF9iYWNrKDIpOwogIGwucHVzaF9iYWNrKDEpOwogIGZvciAoYXV0byBpIDogbCkgc3RkOjpjb3V0IDw8IGkgPDwgIiAiOwogIHN0ZDo6Y291dCA8PCAiXG4iOwp9