假设以下代码:
template<typename T>
void print(T in){
std::cout << in << std::endl;
}
可以使用以下两种方法:
print(5);
print<int>(5);
那么类型是可选的,还是有理由拥有它们?
答案 0 :(得分:8)
有一种称为模板参数推导的机制。来自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起,class template argument deduction允许您编写:
std::pair p(2, 4.5); // deduces to std::pair<int, double> p(2, 4.5);