Итак, я создаю свой собственный динамический c контейнер массива, похожий на 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 прекрасно работал с любым типом, который я предоставляю шаблону (woohoo!). Тем не менее, моя текущая реализация, кажется, задыхается, когда я пытаюсь использовать указатель вместо типа объекта. Хороший пример этого был бы в деструкторе:
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*
, на который компилятор по праву спотыкается и продолжает падать вниз по длинной лестнице. Также есть несколько других мест, где подобные вещи происходят, но я оставил их для краткости.
Итак, мой вопрос: как правильно обрабатывать этот класс шаблонов, чтобы он позволял мне создавать контейнер шаблонов, который может обрабатывать как указатели, так и не указательные типы? Должен ли я использовать какую-то технику специализации шаблонов для функций, где возникает такая проблема? Заранее спасибо. :)