
在std命名空间中标准库以模板函数的方式实现了swap算法:
? ? namespace std{
? ? template
? ? void swap(T&a,T&b)
? ? {
? ? ? ? T temp(a);
? ? ? ? a=b;
? ? ? ? b=temp;
? ? }
}
首先,如果swap的缺省实现码的效率可以接受,不需要做任何额外的事情;
其次,如果缺省实现的效率不足,应该按如下方法实现swap函数功能
1、提供一个public swap成员函数,让它高效的置换类型的两个对象值;(此函数不应该抛出异常)
2、在class或者template所在的命名空间内提供一个non-member swap,并另它调用上述swap成员函数
3、如果真在编写一个class(非class template),为所定义的class特化std::swap,并另它调用swap成员函数(为了让非正确的调用方式std::swap(obj1,obj2)也能准确匹配正确的swap函数)
4、在需要调用swap函数的地方包含using std::swap让其可见,然后再调用
? ? using std::swap;
? ? swap(obj1,obj2)
? ?根据C++函数匹配规则(primer C++ p616)如果一个非模板函数与一个模板函数提供同样好的匹配,则选择非模板版本;如果有多个重载模板对一个调用提供同样好的匹配,则选择最特例化的版本
?
编译器匹配swap函数的过程如下图所示
?
?
?
综上所述,对于定义class的swap函数,如下
? namespace WidgetStuff{
? class Widget{
? ? public:
? ? ………
? ? void swap(Widget& other)
? ? ? ? {
? ? ? ? using std::swap;
? ? ? ? swap(pImpl,other.pImpl);
? ? ? ? }
? ? …..
? ? };
? ? void swap(Widget&a,Widget&b)
? ? ? ? {
? ? ? ? a.swap(b);
? ? ? ? }
}
namespace std{
? ? template
? ? void swap(Widget&a,Widget&b)
? ? {
? ? a.swap(b)
? ? }
}
?
对于 template class应该按如下
《C 中如何定义合适的swap函数,matlab如何定义一个函数》来自互联网同行内容,若有侵权,请联系我们删除!
来电咨询