使用boost::swap交换原始指针

use boost::swap to swap raw pointers?

本文关键字:原始 指针 交换 swap boost 使用      更新时间:2023-10-16

基于第8页

自由功能

template<typename T> void swap(scoped_ptr<T>& a,scoped_ptr<T>& b)

此功能提供了交换两个作用域指针的内容。它更可取,因为swap(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 *'

问题>如何与boost::swap交换原始指针?

我不明白为什么其他答案告诉你不要使用boost::swapboost::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;
}

显然,如果您没有包含boost/swap.hpp,这将不起作用。这就是使用boost::swap交换两个东西的方法。你应该总是喜欢用这种形式交换两样东西!

您所读到的只是简单地指出,boost::scoped_ptr还在boost命名空间中提供了swap的重载,因此这也起作用:

#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);
}

但应该清楚的是,这不会奏效:

#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;
}

因为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;
}

就像那样。如果你有Boost可以做,不要回到使用std::swap的东西。

这归结为交换习惯用法,或者用户代码应该如何实现交换。为命名空间N中具有一组成员m1的类型T实现swap的推荐方法。。。mN是:

namespace N {
    void swap( T& lhs, T& rhs ) {
       using std::swap;
       swap( lhs.m1, rhs.m1 );
       ...
       swap( lhs.mN, rhs.mN );
    }
}

该习语利用了ADL(参数相关查找)。它首先将std::swap的定义注入到范围中,这样当不存在更好的重载来交换特定元素时,它就可用了。然后,它使用不合格的自由函数swap,知道如果mn成员中的任何一个的类型Tn定义了自由函数交换,ADL将把它带入范围,并且将使用专门的swap而不是std::swap

文档所说的是,您不应该调用ptr1.swap( ptr2 ),而应该调用不合格的swap( ptr1, ptr2 )来交换任何元素,包括scoped_ptr对象,遵循上面的习惯用法。也就是说,如果您这样实现交换,swap函数就不需要因为成员类型的更改而更改,包括指针是原始指针还是scoped_ptr