#include <type_traits>
#include <vector>
#include <deque>
#include <string>
#include "iostream"
using namespace std;
template<class T>
auto maybe_reserve(T& v, size_t n, int)
    -> decltype(v.reserve(n), void())
{
    cout<< "call reserve" << endl;
  v.reserve(n);
}

template<class T>
void maybe_reserve(T&, size_t, long){
	cout << "don't call" << endl;
}

template<typename T>
T fill(size_t n) {
    T v;
    maybe_reserve(v, n, 0);
    for(size_t i = 0; i < n; ++i){
        v.push_back('a');
    }
    return v;
}
int main(){
	fill<vector<int>>(5);
	fill<string>(5);
	fill<deque<int>>(5);
}