Теперь я хочу создать шаблон, который будет подталкивать некоторые элементы к векторам и другим типам, поддерживающим операторы push_back
.Функция вызова, если есть, игнорировать иначе
я могу это сделать, как этот
template<typename T>
T fill(size_t n) {
T v;
//(1)
for(size_t i = 0; i < n; ++i){
v.push_back(generate_some_how());
}
return v;
}
Он работает. Но теперь я хочу улучшить скорость для типов, которые поддерживают его, используя v.reserve(n);
вместо (1)
. Но я хочу по-прежнему скомпилировать этот код для типов, которые не будут компилироваться. reserve
Это простой способ достичь этого?
Я знаю, что я могу специализировать жестко кодированные типы, но это не кажется хорошим.
C++ 11 в порядке.
Я сомневаюсь, но я не знаю точно. Я предполагаю, что вам придется использовать специализированную специализацию –
Не слишком сложно .... вам нужно написать черту, которая обнаруживает наличие функции-члена 'reserve' с правильной подписью. С помощью этого инструмента в вашем поясе существуют разные подходы, вы можете написать функцию шаблона 'reserve_', которая использует эту черту для отправки на вызов' reserve() 'или no-op и вызывать его из' // (1) 'или вы можете использовать SFINAE либо в помощнике, либо в' fill'. Я хотел бы использовать вспомогательную функцию, так как большая часть кода в 'fill' одинакова. –
Если вы используете C++ 11, подумайте о поддержке соответствующего вызова 'emplace' для замены' push_back'. –