C++:class 的前向声明,带有可重复的唯一指针的删除器

C++: Forward declaration of a class with a deleter for a unique pointer that can be repeated

在 C++ 中,可以使用前向声明来允许指向不完整类型的指针。

class A;
A *p;

然而,在某些情况下我想声明一个唯一的指针,所以我使用

class A;
class A_Deleter { void operator()(A*); }
unique_ptr<A, A_Deleter> p;

这在很多情况下都足够了,但有一个主要缺点。与真正的前向声明不同,它不能写两次。 IE。当此代码编译时:

class A;
class A;

这个没有:

class A;
class A_Deleter { void operator()(A*); }
class A;
class A_Deleter { void operator()(A*); }

你如何转发声明一个可删除的class?

为什么要重复?

将声明放在 header 中(使用适当的 include guards)并在需要的地方包含它。

你可以做的是专门为前向声明创建一个header,它也声明了删除器。给 header 通常的警卫,并包括 header 而不是 forward-declaring A.

但总的来说,我会走另一条路。如果我只需要声明唯一指针,我会 forward-declare 并做 unique_ptr<A>。如果我真的有一个唯一指针被销毁的上下文,我会获取 A.

的完整定义

我想我找到了解决办法。

我定义了一个 class 通过 header 对所有人可见:

template <class T> class deleter { void operator()(T *x); }; 

然后我就可以摆脱声明删除器的需要 class 并且可以这样写:

class A;
unique_ptr<A, deleter<A> > p;

每个 Tdeleter<T>::operator() 可以在其自己的 .cpp 文件中使用专门化来实现。