В C ++ вы можете создавать шаблоны с использованием параметра шаблона не типа, как это:
template< int I >
void add( int& value )
{
value += I;
}
int main( int argc, char** argv )
{
int i = 10;
add< 5 >( i );
std::cout << i << std::endl;
}
, который печатает «15», чтобы вытеснить. Что такое использование для этого? Есть ли какие-либо причина использования параметра шаблона не типа вместо чего-то более обычного типа:
void add( int& value, int amount )
{
value += amount;
}
Извините, если это уже было задано (я посмотрел, но ничего не мог найти).
Существует множество причин, например, метапрограммирование шаблонов (проверьте Boost.MPL). Но в этом нет необходимости, C ++ 11 std::tuple
имеет аксессор std::get<i>
, который необходимо индексировать во время компиляции, поскольку результат зависит от индекса.
В данном конкретном случае нет никаких преимуществ. Но используя такие параметры шаблона, вы можете сделать много вещей, которые вы не могли бы сделать иначе, например, эффективно связать переменные с функциями (например, boost::bind
), указать размер массива времени компиляции в функции или классе (std::array
, являющийся готовым примером этого) и т. Д.
Например, с помощью этой функции вы пишете функцию, подобную
template<typename T>
void apply(T f) {
f(somenum);
}
Затем вы можете передать apply
функцию:
apply(&add<23>);
Это очень простой пример, но это демонстрирует принцип. Более сложные приложения включают в себя применение функций к каждому значению в коллекции, вычисление таких факторов, как факториал функции во время компиляции и многое другое.
Вы не могли бы сделать ничего другого.