带有空尖括号<>的模板函数调用

14

我对下面的模板行为感到困惑,因为它在空的尖括号中编译正常(没有参数的模板),由于语法上,template<>保留用于标记显式模板特化。

template <typename T> void add(T a, T b) { }
int main() {
    add<>(10, 3); // compiles fine since both parameters are of same data type
    add<>(10, 3.2); // Error: no matching function for call to add(int, double)
}

在上述情况中,模板参数是否真的是可选的?
3个回答

12

template<>是一个保留字,用于标记显式的模板特化。

它的意义取决于上下文。在这里,它的意思是“使用默认或推断出的参数”,就像你简单地说了 add 一样。

在第一种情况下,函数参数具有相同的类型,因此模板参数可以推断为 int

在第二种情况下,它们具有不同的类型,因此无法推断模板参数。你必须指定你想要的,例如 add<double>,将一个函数参数转换为与另一个匹配,或修改模板以分别参数化每个类型。

在上面的情况中,模板参数真的是可选的吗?

是的,如果可以从参数类型中推断出来。


6

在第一种情况下,可以进行推断,因为它们可以通过标准规则进行推断。而在第二种情况下,不行,因为它们无法被推断 - 你需要编写类似这样的内容:

add<float>(10, 3.2);

3

您有一个模板参数和两个不同类型的函数参数。模板参数推导需要匹配两个参数,但如果您提供int和double,则无法工作。原因是推导参数必须精确匹配,而类型转换不被考虑。

语法:

add<double>(10, 3.2); 

您可以明确强制使T等于double。在这种情况下,int常量10会被转换为double

您还可以添加另一个重载函数。

template <typename T, typename U> void add(T a, U b) { }

并且可能使用 SFINAE 来限制它,要求 is_convertible<T, U>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接