unique_ptr 自定义存储类型示例?
Posted
技术标签:
【中文标题】unique_ptr 自定义存储类型示例?【英文标题】:unique_ptr custom storage type example? 【发布时间】:2011-06-07 12:41:34 【问题描述】:Howard Hinnant explained unique_ptr
也可以使用自定义存储类型。他以“共享内存”为例。
他只给出了粗略的想法(这对于快速介绍来说很好)。但是任何人都可以完成他的 “自定义存储类型” 示例(无论是否共享内存)?
为了支持将
unique_ptr
放入共享内存,自定义删除器可以包含自定义指针类型(在共享内存应用程序中通常不是真正的指针)。只需放置一个名为 pointer 的 嵌套类型,它在您的删除器中模拟指针行为,可公开访问:
template <class T>
class MyDeleter
public:
class pointer
public:
friend bool operator==(pointer x, pointer y);
friend bool operator!=(pointer x, pointer y);
// ...
;
void operator()(pointer p);
;
void test()
unique_ptr<int, MyDeleter<int> > p;
MyDeleter<int>::pointer p2 = p.get(); // A custom pointer type used for storage
我怀疑// ...
必须扩展,test()
可能会在真正的“自定义存储类型”示例中做一些额外的事情。
谁能告诉我他/她在哪里
实际上已经使用过此自定义, 在那个上下文中, 哪个自定义代码,(可能在//...
)
以及客户端代码如何使用它? (test()
可能)
【问题讨论】:
这种自定义不太可能有很多用途——因为它是一个非常新的库功能。 【参考方案1】:您可能对boost::offset_ptr 感兴趣,它是unique_ptr
中此自定义点的激励用例。 offset_ptr
是一种完全开发的指针类型,可以使用简单的 typedef 安装到自定义删除器中。它的用例是将unique_ptr
放入共享内存中。
【讨论】:
【参考方案2】:20.7.1.2/3 告诉我们
unique_ptr
::pointer 类型应满足 NullablePointer (17.6.3.3) 的要求。
根据 17.6.3.3,给定类型 P
,这些要求是:
P
是 EqualityComparable、DefaultConstructible、CopyConstructible、
CopyAssignable 和 Destructible
P
的左值可交换
对P类型的对象进行值初始化会产生该类型的空值,空值应仅与自身等价
P
类型的对象可以上下文转换为bool
P
类型的对象可以用nullptr
进行初始化和分配,这会产生空值
P
类型的对象与nullptr
比较可以相等,当且仅当对象具有空值时比较为真
所有必需的操作都不会抛出(但不需要显式的noexcept
或throw()
)
请特别注意,operator*
和 operator->
实际上并不是必需的。另请注意,内置数字类型满足除nullptr
初始化/赋值之外的所有要求。
例如,以下类型应满足所有要求:
class handle
int id;
public:
// default and nullptr constructors folded together
handle(std::nullptr_t = nullptr) : id(0)
explicit operator bool() return l.id != 0;
friend bool operator ==(handle l, handle r) return l.id == r.id;
friend bool operator !=(handle l, handle r) return !(l == r);
// default copy ctor and operator= are fine
// explicit nullptr assignment and comparison unneeded
// because of implicit nullptr constructor
// swappable requirement fulfilled by std::swap
【讨论】:
感谢您向我指出该参考,并提供示例。你称那个类为handle
——因此我可以通过在我的deleter中放置一个typdef handler pointer;
来使用那个类?
@towi - 是的。该类应该类似于许多库中使用的某种不透明标识符的包装器,例如 Windows 窗口句柄或 OpenGL 纹理名称。以上是关于unique_ptr 自定义存储类型示例?的主要内容,如果未能解决你的问题,请参考以下文章
带有 C++11+ unique_ptr 的 Libevent
指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器