使用boost::swap交换原始指针
use boost::swap to swap raw pointers?
基于第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::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;
}
显然,如果您没有包含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
。
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- 为包含原始指针的对象C++智能指针
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 将原始指针传递给接受unique_ptr作为参数的函数
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 更改保留指向其字段的原始指针的对象地址
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 如何在C++代码中灵活使用和替换标准::shared_ptr或标准::unique_ptr或原始指针?