条款25:考虑写出一个不抛异常的swap函数

来源:互联网 发布:mysql 5.7 安装 编辑:程序博客网 时间:2024/04/29 18:00

结论1:首先,如果swap的缺省实现码对你的class或class template提供可接受的效率,不需要额外做任何事。

结论2:当std::swap对你的类型效率不高时(几乎总意味着你的class或tempalte使用了某种pimpl(pointer to implementation的缩写)手法),则

(1)提供一个public swap成员函数,让它高效地置换你的类型的两个对象值,并确保这个函数不抛出异常,因为高效的swaps几乎总是基于对内置类型的操作,而内置类型上的操作绝不会抛出异常。

(2)在你class或template所在的命名空间内提供一个non-member swap,并令它调用public swap成员函数。

(3)如果你正在编写一个class(而非class template),为你的class特化std::swap,并令它调用public swap成员函数。

(4)调用swap时应针对std::swap使用using 声明式,以便让std::swap在你的函数内曝光可见,然后不加任何namespace修饰符,赤裸裸地调用swap。

结论3:通常不能够改变std命名空间内的任何东西,但可以为标准template制造特化版本,使它专属于“用户自定义类型”。

C++允许对class template、function template全特化(模板特化即有时为了需要,针对特定的类型,需要对模板进行特化,也就是特殊处理),即对所有模板参数均特化,但只允许对class template偏特化,不允许对function template偏特化,即只特化部分模板参数。

0 0
原创粉丝点击