Причина использования параметра шаблона без типа вместо обычного параметра?

В 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;
}

Извините, если это уже было задано (я посмотрел, но ничего не мог найти).

24
задан Chris Vig 13 September 2011 в 00:54
поделиться

2 ответа

Существует множество причин, например, метапрограммирование шаблонов (проверьте Boost.MPL). Но в этом нет необходимости, C ++ 11 std::tuple имеет аксессор std::get<i>, который необходимо индексировать во время компиляции, поскольку результат зависит от индекса.

1
ответ дан 28 November 2019 в 23:33
поделиться

В данном конкретном случае нет никаких преимуществ. Но используя такие параметры шаблона, вы можете сделать много вещей, которые вы не могли бы сделать иначе, например, эффективно связать переменные с функциями (например, boost::bind), указать размер массива времени компиляции в функции или классе (std::array, являющийся готовым примером этого) и т. Д.

Например, с помощью этой функции вы пишете функцию, подобную

template<typename T>
void apply(T f) {
    f(somenum);
}

Затем вы можете передать apply функцию:

apply(&add<23>);

Это очень простой пример, но это демонстрирует принцип. Более сложные приложения включают в себя применение функций к каждому значению в коллекции, вычисление таких факторов, как факториал функции во время компиляции и многое другое.

Вы не могли бы сделать ничего другого.

5
ответ дан 28 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: