#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( void ( v.reserve ( n) ) )
{
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 ) ;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZGVxdWU+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlICJpb3N0cmVhbSIKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdGVtcGxhdGU8Y2xhc3MgVD4KYXV0byBtYXliZV9yZXNlcnZlKFQmIHYsIHNpemVfdCBuLCBpbnQpCiAgICAtPiBkZWNsdHlwZSh2b2lkKHYucmVzZXJ2ZShuKSkpCnsKICAgIGNvdXQ8PCAiY2FsbCByZXNlcnZlIiA8PCBlbmRsOwogIHYucmVzZXJ2ZShuKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4Kdm9pZCBtYXliZV9yZXNlcnZlKFQmLCBzaXplX3QsIGxvbmcpewoJY291dCA8PCAiZG9uJ3QgY2FsbCIgPDwgZW5kbDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KVCBmaWxsKHNpemVfdCBuKSB7CiAgICBUIHY7CiAgICBtYXliZV9yZXNlcnZlKHYsIG4sIDApOwogICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSl7CiAgICAgICAgdi5wdXNoX2JhY2soJ2EnKTsKICAgIH0KICAgIHJldHVybiB2Owp9CmludCBtYWluKCl7CglmaWxsPHZlY3RvcjxpbnQ+Pig1KTsKCWZpbGw8c3RyaW5nPig1KTsKCWZpbGw8ZGVxdWU8aW50Pj4oNSk7Cn0=
compilation info
prog.cpp: In instantiation of ‘void maybe_reserve(T&, size_t, int) [with T = std::deque<int>; size_t = unsigned int]’:
prog.cpp:23:5: required from ‘T fill(size_t) [with T = std::deque<int>; size_t = unsigned int]’
prog.cpp:32:20: required from here
prog.cpp:12:3: error: ‘class std::deque<int>’ has no member named ‘reserve’
stdout