模板类型是否可选使用?

时间:2019-04-12 21:32:15

标签: c++

假设以下代码:

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

可以使用以下两种方法:

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

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

1 个答案:

答案 0 :(得分:8)

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

  

为了实例化功能模板,每个模板参数   必须知道,但并非必须指定每个模板参数。   如果可能,编译器将推断出缺少的模板参数   从函数参数。当函数调用为   尝试使用功能模板的地址时   其他一些情况:[...]

在您的示例中,编译器可以推导模板参数T,因为5int。因此,称为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起,class template argument deduction允许您编写:

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