首页 > 解决方案 > 模板类型是可选的吗?

问题描述

假设以下代码:

template<typename T>
   void print(T in){
   std::cout << in << std::endl;
}

可以使用以下两种方法:

print(5);
print<int>(5);

那么这些类型是可选的还是有理由拥有它们?

标签: c++

解决方案


有一种称为模板参数推导的机制。从cppreference

为了实例化函数模板,必须知道每个模板参数,但不是必须指定每个模板参数。如果可能,编译器将从函数参数中推断出缺少的模板参数。当尝试调用函数、获取函数模板的地址以及在其他一些上下文中时,会发生这种情况:[...]

在您的示例中,编译器可以推断出模板参数T,因为5它是一个int. 因此void print<int>(int in)被称为。

那么这些类型是可选的还是有理由拥有它们?

有时您仍然需要显式编写模板参数。例如,如果您希望发生一些转换,您可以致电

print<double>(5);
print<int>(5.3);  // prints 5

模板类也是如此吗?

在 C++17 之前,通常使用函数模板来创建类模板的实例。看std::make_pair作为一个例子。没有它,就无法省略模板参数

auto x = std::pair(1,2);          // before c++17: error missing template arguments
auto x = std::pair<int,int>(1,2); // OK
auto x = std::make_pair(1,2);     // OK deduces std::make_pair<int,int>  

由于 C++17 有类模板参数推导,它允许您编写:

std::pair p(2, 4.5);     // deduces to std::pair<int, double> p(2, 4.5);

推荐阅读