我读过很多问题和答案,但是这个问题 https://stackoverflow.com/questions/12550398/why-we-use-non-type-template-arguments最吸引我的眼球;它及其答案很有帮助,但我仍然觉得我没有完全理解使用非类型模板参数背后的用途和理论。他们提供了许多关于何时使用它的有用示例,但没有一个真正阐明非类型模板参数背后的理论。
我感兴趣的不是具体在示例中,而是更广泛地了解为什么我倾向于使用非类型模板参数而不是常规函数参数。
我知道它们是在编译时确定的,并且每个新调用都会创建一个具有非类型模板参数的确定值的新函数。那么,为什么我想要创建同一函数的许多不同实例,因为我只需将所需的参数输入到一个函数中,并且只用一个编译函数就可以得到相同的结果(据说)。
本质上,为什么我应该倾向于做#1,而不是#2,根据最后一节这一页 http://www.cplusplus.com/doc/tutorial/functions2 of cplusplus.com http://www.cplusplus.com?
#1:
template <class T, int N>
T fixed_multiply (T val)
{
return val * N;
}
int main() {
std::cout << fixed_multiply<int,2>(10) << '\n';
std::cout << fixed_multiply<int,3>(10) << '\n';
}
#2:
template <class T>
T fixed_multiply (T val, int N)
{
return val * N;
}
int main() {
std::cout << fixed_multiply<int>(10, 2) << '\n';
std::cout << fixed_multiply<int>(10, 3) << '\n';
}
此外,是否会有任何性能优势或类似优势?是否有任何常见应用程序可以从使用非类型模板参数中受益,或者这是在特定应用程序中使用的高科技参数以产生特定结果?
编辑:由于某种原因,这被标记为重复,第一段解释了我提出类似问题的原因。