这个结构是什么: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