C++模板函数声明、类模板用法及运行特性相关疑问咨询
C++模板问题解答
问题1解答
你的理解完全正确:
- 第一段代码就是带单个类型模板参数
T的函数模板,T的具体类型会在编译期根据传入参数的类型推导确定,函数返回值固定为int类型。 - 多个模板参数确实可以按照
template <class T, class U>的格式声明,模板参数声明里class和typename作用完全一致,替换为template <typename T, typename U>也可以正常使用。
问题2解答
- C20之前没有显式声明模板参数要求的语法,参数需要满足的属性是隐式定义在模板内部用到的操作里的:比如
sgn函数用到了T(0)构造、<比较运算符,就要求传入的T类型支持这两个操作;mypair的getmax用到了>比较运算符,就要求T支持>比较。C20引入了concept语法后才支持显式声明模板参数约束。 - 第二段代码的
mypair确实是模板类声明。 - 要给
mypair添加第二个模板参数U,可以直接写template <class T, class U> class mypair {...,但需要同步调整类内成员的类型、类外定义的成员函数的模板参数列表,比如类外的getmax需要改为template <class T, class U> T mypair<T,U>::getmax ()的格式。
问题3解答
mypair<T>里的T和定义mypair类模板时声明的类型模板参数T是一一对应的。因为getmax是模板类mypair的成员函数,在类外定义模板类的成员函数时,需要先声明和类模板一致的模板参数列表,再通过mypair<T>指明该成员函数所属的模板类实例,编译期类实例化时传入什么类型,这里的T就会被替换为对应的类型。
问题4解答
这个说法是正确的:
- 模板需要在编译期完成类型推导、模板实例化、额外的语法检查工作,所以会增加编译时长。
- 模板最终生成的是对应类型的原生函数/类代码,和手动编写的同类型非模板代码没有差异,没有额外的运行时开销,不会影响运行时性能,部分场景下编译器还可以针对模板生成的代码做更多编译期优化,性能反而优于动态多态实现。
内容的提问来源于stack exchange,提问作者financial_physician
相关产品推荐
相关产品推荐

