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

q09*_*987 3 c++ boost

基于第8页

自由功能

template<typename T> void swap(scoped_ptr<T>& a,scoped_ptr<T>& b)
Run Code Online (Sandbox Code Playgroud)

此函数提供了交换两个作用域指针内容的首选方法.这是优选的,因为交换(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

Dav*_*eas 5

这归结为交换习惯用法,或者用户代码应该如何实现交换.实施的建议方法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.


GMa*_*ckG 5

我不明白为什么其他答案告诉你不要使用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东西。