4.5.3 特化std::swap
接下来我们示范利用模板特化的方法使用boost::swap。用一个简单的三维空间的点point作为例子,它实现了内部高效的交换函数:
- class point
- {
- int x, y, z;
- public:
- explicit point(int a=0, int b=0, int c=0):x(a),y(b),z(c){}
- void print()const
- { cout << x <<","<< y <<","<< z << endl; }
- void swap(point &p) //内置高效交换函数
- {
- std::swap(x, p.x);
- std::swap(y, p.y);
- std::swap(z, p.z);
- cout << "inner swap" << endl;
- }
- };
特化std::swap()的方法需要向std名字空间添加自定义函数(虽然原则上是不允许变动std名字空间的),代码如下:- namespace std
- {
- template<>
- void swap(point &x, point &y) //模板特化swap函数
- {x.swap(y);}
- }
- int main()
- {
- point a(1,2,3), b(4,5,6);
- cout << "std::swap" << endl;
- std::swap(a,b); //调用std::swap
- cout << "boost::swap" << endl;
- boost::swap(a, b); //调用boost::swap
- }
程序运行结果如下:- std::swap
- inner swap
- boost::swap
- inner swap
由于我们在名字空间特化了std::swap,因此,boost::swap与std::swap的效果相同,都使用了特化后的swap函数。