完成模板函数改写后,对适配类型需支持操作的疑问咨询
解答:模板函数改写与类型要求
你改写的模板函数完全正确!咱们来重点解决你困惑的第二部分:要让这个FindLargest模板能正常处理某个类型T,该类型必须支持以下操作:
- 支持默认构造:你的代码里先声明了
T ret;,这会调用类型T的默认构造函数创建一个对象,之后再给它赋值。如果某个类型没有默认构造函数(比如自定义的只提供带参构造的类),这段代码就会编译失败。 - 支持
const对象的大于比较(operator>):代码中使用了if (a > b),这里的a和b都是const T&类型,所以T必须提供一个能处理两个const对象的大于运算符重载——要么是const成员函数版本的operator>,要么是非成员函数版本的operator>,参数为const T&。 - 支持赋值操作(
operator=):当执行ret = a或ret = b时,需要T支持将一个const T对象赋值给另一个T对象,也就是T必须有合适的operator=重载,参数为const T&。 - 支持拷贝构造(或移动构造):函数最后
return ret;会将局部对象ret作为返回值返回,这需要T能被拷贝(调用拷贝构造函数);在C++11及以后的标准中,如果类型支持移动构造,编译器也会优先使用移动操作优化返回过程,但从语法兼容性来说,拷贝构造是基础要求。 - 支持
const引用绑定:函数参数是const T&,这要求T是一个可以被const引用指向的类型——大部分合法的C++类型都满足这一点,除非是一些特殊的不完整类型,日常使用的类型基本都没问题。
另外补充个小优化:你可以把函数里的代码简化成一行,这样还能避免对默认构造的依赖:
template<typename T> T FindLargest(const T& a, const T& b) { return (a > b) ? a : b; }
这种写法下,T就不需要支持默认构造了,只需要满足比较、拷贝/移动构造的要求即可,适用性更广。
内容的提问来源于stack exchange,提问作者xian cao
相关产品推荐
相关产品推荐

