在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?

What's the best way to handle pointer & non-pointer template types in a custom std::vector-like container?

本文关键字:指针 类型 最佳 是什么 方法 vector-like 自定义 处理 std      更新时间:2023-10-16

所以我正在构建自己的动态数组容器,类似于std::vector,用于娱乐/研究。 我的容器的精简标题如下所示:

template<class ElementClass> 
class Array
{
public:
Array(class Allocator* allocator, size_t initialCapacity);
~Array();
...
private:
class Allocator* allocator;
ElementClass* pFirst;
size_t m_capacity;
size_t m_size;
};

到目前为止,我的 Array 类可以很好地与我提供给模板的任何类型配合使用(呜呜! 但是,当我尝试使用指针而不是对象类型时,我当前的实现似乎很难窒息。 一个很好的例子是在析构函数中:

template<class ElementClass>
Array<ElementClass>::~Array()
{
for (size_t c = 0; c < m_capacity; c++)
{
pFirst[c]->~ElementClass();
}
allocator->free(pFirst);
}

这显然会导致一个令人讨厌的错误,因为例如,如果我要做一个Array<int*>,那么ElementClass会转换为int*,编译器理所当然地绊倒并继续从长长的楼梯上摔下来。 还有一些其他地方会发生这种事情,但为了简洁起见,我省略了这些。

所以我的问题是:处理这个模板类的正确方法是什么,以便它允许我创建一个可以处理指针和非指针类型的模板容器? 我是否应该对出现此类问题的功能使用某种模板专用化技术? 提前谢谢。 :)

您似乎正在做的是在指针指向的元素上调用 dtor,而不是存储在数组中的指针值。如果你的数组在 dtor 中做其他事情,它做错了......

template<class ElementClass>
Array<ElementClass>::~Array()
{
for (size_t c = 0; c < m_size; c++)
{
pFirst[c].~ElementClass();
}
allocator->free(pFirst);
}

在数组中的指针指向的对象上调用 dtor 对我来说似乎非常危险。谁知道这些指针来自哪里(NULL、堆栈分配变量等(。

数组是"错误 C2325:'int *':'->~'右侧的意外类型:预期的'int'"。

元素类的类型为int*。您正在尝试取消引用该指针,因此现在类型为int。然后,您正在尝试在int上调用类型int*的 dtor。

相关文章: