首先知道什么是智能指针,它是一个对象,只不过它的行为像指针而已,但是它还提供了指针没有的机能。
一般的指针都支持隐式转换,但是智能指针难于支持隐式转换。
泛型类在具体化以后就会形成多个互不相干的类,在这里作者想让它们之间发生联系,主要是指互相转换的能力。从作者的说明中可以看出这主要是根据某个对象构造出另一个对象的能力,毫无疑问这涉及到构造函数。那如何编写出一个构造函数来满足这些需求就是本原则要讨论的重点。因为我们现在讨论的对象是泛型,所以我现在讨论的构造函数必须是泛型中的构造函数,它被称为成员函数模版(member function templates)。
作者使用的方法是模版类的模版参数与构造函数的模版参数是不同的,独立的,这两个模版参数代表了不同的类型,这为类型转换提供了很大的空间。构造函数前面没有explicit关键字,这说明它支持隐式转换。目前这种状态虽说能满足我们的要求,但是它提供了太多多余的东西,比如说有的时候我们只需要单向的转换,但是它提供的是双向的转换,这些多余的转换并不是我们所需的。因此我们必须对它们进行限制和筛选。从作者的例子来看这一版是在模版类的模版构造函数中实现的。具体的做法是在成员初始化列表中初始化带有类模版参数的成员变量,并以函数模版参数作为初值,就是以函数模版参数去初始化类模版参数,这样如果这两参数之间确实存在隐式类型转换,它们就自动进行隐式类型转换,否则不。
函数模版不仅仅限于构造函数,它也经常用于赋值操作。作者在这里谈到一个问题,函数模版的COPY构造函数毕竟不是系统自动生成的那个版本,那么编译器是自动为模版类生成一个COPY构造函数呢?还是说等那个函数模版版的COPY构造函数具体化以后使用这个具体化的COPY构造函数呢?本原则说这个函数模版并不影响编译器的规则,也就是说编译器还是会自动生成的,除非你自己写了。
所以总结一下作者的观点如下:
1、使用成员函数模版生成可以接受所有兼容类型的函数。
2、如果你是用函数模版版的COPY构造函数和COPY赋值操作符,那你还要声明正常的COPY构造函数和COPY赋值操作符。
原则45:运用成员函数模版接受所有兼容类型
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 本原则要解决的问题是在泛型中让隐式转换发生在所有实参上。泛型编程和普通编程相比的一个最大的不同是编译器无法预先知道...
- 在C++11中,我们还是会看到一些新元素。这些新鲜出炉的元素可能会带来一些习惯上的改变,不过权衡之下,可能这样的改...
- 收集非原创文章,如遇原作者,请私聊我,我会表明出处! 1--10 1. C++中什么数据分配在栈或堆,静态存储区以...