最近在我的面向对象编程类中,我们处理的是模板。
在我们得到的一个问题中,我们被要求创建一个可以存储任何类型的队列类 现在我的问题开始了,当我想在这个队列中存储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
}
//...
}
感谢您的帮助:)
答案 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
,因为您无法将数组视为简单值。此外,使用new
和delete
进行此类任务也会产生代码异味。
指南 :在现代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);
}