Самая большая разница в том, что вы можете сделать с этими двумя функциями:
- Функция шаблон принимает два ее пределы в качестве параметров шаблона, что означает, что они должны быть известны во время компиляции
- регулярная функция принимает свои два предела как регулярные параметры, то есть вы можете использовать для них переменные.
По существу, вторая функция позволяет сделать это
int a, b;
cout << "Please enter two limits: ";
cin >> a >> b;
string s("quick brown fox");
bool res = byLength(s, a, b);
Это не возможно с помощью функции шаблона:
int a, b;
cout << "Please enter two limits: ";
cin >> a >> b;
string s("quick brown fox");
bool res = byLength<a,b>(s); // <<== DOES NOT COMPILE.
Если все вызовы используют постоянные выражения для предельных параметров, Функция шаблона может позволить вам сохранить несколько дополнительных циклов процессора, потому что компилятор может лучше оптимизировать свою работу. Трудно представить себе ситуацию, когда эти дополнительные циклы будут иметь значимую разницу.
Почему бы просто не использовать второй пример?
Бывают ситуации, когда в вашей функции требуется постоянная времени компиляции. Например, если вы хотите объявить std::array<len>
на основе одного из параметров, он должен быть передан в качестве параметра шаблона, а не в качестве обычного параметра:
template<size_t sz>
void demo() {
std::array<sz> data;
...
}
То же не будет работать с регулярными параметрами функции:
void demo(size_t sz) {
std::array<sz> data; // <<== DOES NOT COMPILE.
...
}
Шаблоны разрешены * время компиляции *, аргументы оцениваются в * время выполнения *. Это означает, что аргументы шаблона должны быть постоянными, чтобы быть разрешенными компилятором, в то время как аргументы функции могут быть такими, как использование-ввод, которые невозможно оценить во время компиляции. –
Хорошо, похоже, я понимаю глупость вопроса. Могу ли я удалить его? –
Вы называете их по-разному: 'byLength (строка)' vs 'byLength (строка, min, max)'. Если это имеет значение для ваших глаз. –
rubikonx9