c++ - 模板类型是可选的吗?
问题描述
假设以下代码:
template<typename T>
void print(T in){
std::cout << in << std::endl;
}
可以使用以下两种方法:
print(5);
print<int>(5);
那么这些类型是可选的还是有理由拥有它们?
解决方案
有一种称为模板参数推导的机制。从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);
推荐阅读
- unetstack - 在 UnetStack 中交换控制信息
- reactjs - 如何将 NativeBase Drawer 放在一切之上
- delphi - TpopUpMenu 后面的 Webbrowser 组件没有响应
- python - 从字典中的字典获取值(在集合内)
- android - Android Studio:找不到 org.jacoco:org.jacoco.agent:org.gradle.testing.jacoco.plugins.JacocoPluginExtension_Decorated
- laravel-5 - 如何在 laravel 中查询模型及其相关模型
- c# - JSON Serializer 尝试访问早已不复存在的 EntityFramework 上下文,以获取我不要求或不关心的数据
- java - 用一系列整数值初始化 ArrayList,避免循环
- sapui5 - View1.controller.js?eval:8 Uncaught (in promise) TypeError: Cannot read property 'getModel' of undefined
- ibm-cloud - 如何在 Compose for MongoDB 服务中更改管理员帐户的默认密码?