原则45:运用成员函数模版接受所有兼容类型

首先知道什么是智能指针,它是一个对象,只不过它的行为像指针而已,但是它还提供了指针没有的机能。
一般的指针都支持隐式转换,但是智能指针难于支持隐式转换。
泛型类在具体化以后就会形成多个互不相干的类,在这里作者想让它们之间发生联系,主要是指互相转换的能力。从作者的说明中可以看出这主要是根据某个对象构造出另一个对象的能力,毫无疑问这涉及到构造函数。那如何编写出一个构造函数来满足这些需求就是本原则要讨论的重点。因为我们现在讨论的对象是泛型,所以我现在讨论的构造函数必须是泛型中的构造函数,它被称为成员函数模版(member function templates)。
作者使用的方法是模版类的模版参数与构造函数的模版参数是不同的,独立的,这两个模版参数代表了不同的类型,这为类型转换提供了很大的空间。构造函数前面没有explicit关键字,这说明它支持隐式转换。目前这种状态虽说能满足我们的要求,但是它提供了太多多余的东西,比如说有的时候我们只需要单向的转换,但是它提供的是双向的转换,这些多余的转换并不是我们所需的。因此我们必须对它们进行限制和筛选。从作者的例子来看这一版是在模版类的模版构造函数中实现的。具体的做法是在成员初始化列表中初始化带有类模版参数的成员变量,并以函数模版参数作为初值,就是以函数模版参数去初始化类模版参数,这样如果这两参数之间确实存在隐式类型转换,它们就自动进行隐式类型转换,否则不。
函数模版不仅仅限于构造函数,它也经常用于赋值操作。作者在这里谈到一个问题,函数模版的COPY构造函数毕竟不是系统自动生成的那个版本,那么编译器是自动为模版类生成一个COPY构造函数呢?还是说等那个函数模版版的COPY构造函数具体化以后使用这个具体化的COPY构造函数呢?本原则说这个函数模版并不影响编译器的规则,也就是说编译器还是会自动生成的,除非你自己写了。
所以总结一下作者的观点如下:
1、使用成员函数模版生成可以接受所有兼容类型的函数。
2、如果你是用函数模版版的COPY构造函数和COPY赋值操作符,那你还要声明正常的COPY构造函数和COPY赋值操作符。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容