这个结构是什么:template <int> void funcName(int i)?
What is this construct : template <int> void funcName(int i)?
我不小心在编写模板函数特化代码时犯了一个错误,生成的构造通过了 VS17 的编译。 (下面包含的代码中的第三个构造)
这是一个有效的结构吗?
我该如何调用这个函数?
template <class T> void tempfunc(T t)
{
cout << "Generic Template Version\n";
}
template <>
void tempfunc<int>(int i) {
cout << "Template Specialization Version\n";
}
template <int> void tempfunc(int i)
{
cout << "Coding Mistake Version\n";
}
我一直无法调用第三个构造。
template
参数有两种——类型参数和non-type参数。
当你使用
template <class T> void tempfunc(T t) { ... }
template
参数是类型参数。要使用这样的模板,必须推导或显式提供类型。
当你使用
template <int> void tempfunc(int i) { ... }
template
参数是 non-type 参数。据我所知,无法推导出non-type参数的值。必须明确提供。
最后一个 template
使用了一个 non-type 参数。调用它的值必须是 int
类型。调用示例:
tempfunc<0>(20);
tempfunc<999>(34);
是的,这是一个有效的结构。这是一个模板重载,模板化在类型为 int
.
的 non-type 模板参数上
你可以这样称呼它:
tempfunc<42>(42);
请注意,没有模板语法的调用仍将调用基于类型参数模板化的版本:
tempfunc(42); // calls specialization
tempfunc(true); // calls primary
这是一个demo
我不小心在编写模板函数特化代码时犯了一个错误,生成的构造通过了 VS17 的编译。 (下面包含的代码中的第三个构造)
这是一个有效的结构吗? 我该如何调用这个函数?
template <class T> void tempfunc(T t)
{
cout << "Generic Template Version\n";
}
template <>
void tempfunc<int>(int i) {
cout << "Template Specialization Version\n";
}
template <int> void tempfunc(int i)
{
cout << "Coding Mistake Version\n";
}
我一直无法调用第三个构造。
template
参数有两种——类型参数和non-type参数。
当你使用
template <class T> void tempfunc(T t) { ... }
template
参数是类型参数。要使用这样的模板,必须推导或显式提供类型。
当你使用
template <int> void tempfunc(int i) { ... }
template
参数是 non-type 参数。据我所知,无法推导出non-type参数的值。必须明确提供。
最后一个 template
使用了一个 non-type 参数。调用它的值必须是 int
类型。调用示例:
tempfunc<0>(20);
tempfunc<999>(34);
是的,这是一个有效的结构。这是一个模板重载,模板化在类型为 int
.
你可以这样称呼它:
tempfunc<42>(42);
请注意,没有模板语法的调用仍将调用基于类型参数模板化的版本:
tempfunc(42); // calls specialization
tempfunc(true); // calls primary
这是一个demo