创建给定模板的数组(c ++)

时间:2015-01-17 20:46:08

标签: c++ oop templates

最近在我的面向对象编程类中,我们处理的是模板。

在我们得到的一个问题中,我们被要求创建一个可以存储任何类型的队列类 现在我的问题开始了,当我想在这个队列中存储somesort数组时,例如:

队列< char *>

现在,当我想在队列中插入一个新的“节点”时,我不想创建指向内存块的双重节点。所以基本上我的问题是:“我如何创建一个与模板类所指向的相同类型的数组?”

template<class T>
void Queue::enQueue(const T& value, int size = 1)
{
//exeptions handaling...
//handaling the case in wich the template is a pointer
if( _Is_pointer<T>() == true )
{
    T temp = new T[size]; // i know its a mistake but thats what i basicly mean to do
    for(int i = 0; i < size; i++)
        temp[i] = value[i];

    m_arr[++m_occupied] = temp; // m_arr is a data member of the T objects, m_occupied is as the name suggest
}

//...
}

感谢您的帮助:)

1 个答案:

答案 0 :(得分:2)

您可以为您设置模板参数演绎

// handling the case in wich the template is a pointer
template <class T> void Queue::enQueue(T const* value, int size = 1) {

这样,重载会将T推断为value指向的对象类型。

现在,您可能希望std::vector,因为您无法将数组视为简单值。此外,使用newdelete进行此类任务也会产生代码异味。

  

指南 :在现代c ++中,vector<>是动态大小的数组的默认容器,array<>是固定大小的数组。

// handling the case in wich the template is a pointer
template <class T> void Queue::enQueue(T const* value, int size = 1) {
    m_arr[++m_occupied] = temp(value, value + size);
}

BONUS 如果您传递对数组的真实引用,您甚至可以推断出具有大小的数组:

// handling the case in wich the template is an array reference
template <class T, size_t Size> void Queue::enQueue(T const (&value)[Size]) {
    m_arr[++m_occupied] = std::vector<T>(value, value + Size);
}