基于第8页
自由功能
Run Code Online (Sandbox Code Playgroud)template<typename T> void swap(scoped_ptr<T>& a,scoped_ptr<T>& b)此函数提供了交换两个作用域指针内容的首选方法.这是优选的,因为交换(scoped1,scoped2)可以被一般地应用(在模板化码),以许多指针类型,包括原始指针和第三方智能指针.[2] scoped1.swap(scoped2)仅适用于智能指针,不适用于原始指针,仅适用于定义操作的指针.
int* pA = new int(10);
int *pB = new int(20);
boost::swap(pA, pB); // Error: could not deduce template argument for 'boost::scoped_ptr<T> &' from 'int *'
Run Code Online (Sandbox Code Playgroud)
问题 >如何交换原始指针boost::swap?
这归结为交换习惯用法,或者用户代码应该如何实现交换.实施的建议方法swap的类型T在命名空间中N有一组成员m1... mN是:
namespace N {
void swap( T& lhs, T& rhs ) {
using std::swap;
swap( lhs.m1, rhs.m1 );
...
swap( lhs.mN, rhs.mN );
}
}
Run Code Online (Sandbox Code Playgroud)
这个成语利用了ADL(Argument Dependent Lookup).它首先将定义注入std::swap到作用域中,以便在没有更好的重载来交换特定元素时可用.然后它使用非限定的自由函数swap,知道如果Tn任何mn成员的类型定义了自由函数交换,ADL将把它带入范围并且swap将使用专用而不是std::swap.
文档所说的是你不应该按照上面的习语来调用ptr1.swap( ptr2 ),而是不合格 swap( ptr1, ptr2 )交换包括对象在内的任何元素scoped_ptr.也就是说,如果你实现你的交换,那么swap函数不需要因为你的成员类型的变化而改变,包括指针是否只是一个原始指针scoped_ptr.
我不明白为什么其他答案告诉你不要使用boost::swap. 整个目的就是boost::swap隐藏using std::swap; swap(x, y);业务。这工作得很好:
#include <boost/swap.hpp>
int main()
{
int* pA = new int(10);
int *pB = new int(20);
boost::swap(pA, pB);
delete pA;
delete pB;
}
Run Code Online (Sandbox Code Playgroud)
显然,如果您没有包含boost/swap.hpp此内容,则不会起作用。这就是你用来boost::swap交换两个东西的方式。您应该总是更喜欢以这种形式交换两个东西!
您正在阅读的内容只是简单地说明它还提供了命名空间内部boost::scoped_ptr的重载,因此这也可以工作:swapboost
#include <boost/scoped_ptr.hpp>
int main()
{
boost::scoped_ptr<int> pA(new int(20));
boost::scoped_ptr<int> pB(new int(20));
boost::swap(pA, pB);
}
Run Code Online (Sandbox Code Playgroud)
但应该清楚的是,这是行不通的:
#include <boost/scoped_ptr.hpp>
int main()
{
int* pA = new int(10);
int *pB = new int(20);
boost::swap(pA, pB);
delete pA;
delete pB;
}
Run Code Online (Sandbox Code Playgroud)
因为boost/scoped_ptr.hpp还没有提供(而且确实没有责任提供)boost::swap. boost::swap 如果您想一般使用,则必须包括boost/swap.hpp:
#include <boost/scoped_ptr.hpp>
#include <boost/swap.hpp>
int main()
{
int* pA = new int(10);
int *pB = new int(20);
boost::scoped_ptr<int> pC(new int(20));
boost::scoped_ptr<int> pD(new int(20));
boost::swap(pA, pB);
boost::swap(pC, pD);
delete pA;
delete pB;
}
Run Code Online (Sandbox Code Playgroud)
像那样。如果你有 Boost 可以做,不要退回到使用的std::swap东西。