gpt4 book ai didi

带有模板的 C++ 析构函数 : T could be a pointer or not

转载 作者:太空狗 更新时间:2023-10-29 23:33:06 31 4
gpt4 key购买 nike

我在编写模板类 win C++ 时遇到了一个小问题。问题相当简单:我不知道是否要对参数化类型执行 delete,因为它可能是也可能不是指针。

我看过这个:Destructor in template class c : How to delete field which may be pointer or not pointer?

我已经实现了第一个解决方案,但这需要我专门化整个类,所以这意味着我必须有 2 个类:

template<class T>
class Node {
private:
T _content;
public:
Node(const T c);
~Node();
};

template<class T>
class Node<T*> {
private:
T _content;
public:
Node(const T c);
~Node();
};

我只想拥有第二个版本并且特化析构函数如下:

template<class T>
class Node<T*> {
private:
T _content;
public:
Node(const T c);
~Node();
};
template <class T>
Node<T>::~Node() {
while(!_adjacent.isEmpty()) {
disconnectFrom(_adjacent.first());
}
}
template <class T>
Node<T*>::~Node() {
while(!_adjacent.isEmpty()) {
disconnectFrom(_adjacent.first());
}
delete _content;
}

但随后出现以下错误:

Node.hpp:43:17: error: invalid use of incomplete type ‘class Node<T*>’
Node.hpp:8:7: error: declaration of ‘class Node<T*>’

有什么方法可以只专门化构造函数以避免有 2 个类(我的 Node 类比我在这里展示的要大得多)?

谢谢!

最佳答案

一种解决方案是使用特征类:

template<typename T> struct delete_traits
{
void destroy(T&) {}
};

template<typename T> struct delete_traits<T*>
{
void destroy(T* p) { delete p; }
};

然后在你的类析构函数中写

delete_traits<T>::destroy(_contents);

除了不必专门化 Node 模板外,它还有一个额外的优势,即您可以轻松地添加其他方式来销毁事物,而无需触及您定义的 Node 文件在,通过简单地添加另一个模板特化:

// assumes that mylib_handle is a truly different type, maybe a C struct
// from the C interface of a library
template<> struct delete_traits<mylib_handle>
{
void destroy(mylib_handle& h) { mylib_handle_free(m); }
};

关于带有模板的 C++ 析构函数 : T could be a pointer or not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22847803/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com