堆栈的字符,堆栈的字符串,整数堆栈,整数数组的堆栈等

时间:2009-12-26 19:08:04

标签: c++ templates

我想使用c ++模板制作通用堆栈。堆栈推送方法的原型由下式给出 无效推(t * ptr) 其中t是模板参数。现在指针ptr可能指向一个整数或一个整数数组,它可能指向一个字符或一个字符数组,它可能指向一个双精度数或一个双精度数组等。 我想要的是,我想在push方法中分配内存,如果ptr指向一个整数然后我需要分配关于整数大小的内存,如果ptr指向整数数组然后我需要分配内存根据数组的大小。类似地,对于其他原始数据类型 我的问题是如何确定这个pointe ptr指向一个数组或一个简单的变量。如果无法发现指针指向数组或简单变量,那么建议一种技术来编写此堆栈的push方法。

4 个答案:

答案 0 :(得分:2)

您的建议并不是一个好主意 - 在C ++中无法检测指针是指向单个实例还是数组,但这两者需要区别对待。

就个人而言,我会使用属于C ++标准的std :: stack适配器。

答案 1 :(得分:0)

一旦数组“衰减”到指针,就不可能推断出T *指向的数组的大小。

考虑让您的堆栈类型采用一对指针,一个指向数组中的第一个元素,一个指向数组中的最后一个元素。或者,有一个重载的push方法 - 一个接受一个指针,一个接受一个指针,size_t告诉你指向了多少个对象。

我有点困惑为什么你有一个T *作为参数。为什么不采用T,就像在stl容器上的大多数“添加”操作一样?当你在它的时候,你知道std :: stack存在(它是stl中的“容器适配器”)吗?即使您有充分的理由重新实现它,查看STL获取API设计示例也是一个好主意。

答案 2 :(得分:0)

您的编译器已经负责分配和复制。如果像这样定义推送:

push(T item)

编译器会为您复制该项目,您可以将其填入内部存储区。

此外,int和int []是两种不同的类型。如果你想专门制作一个可以接受T []的堆栈,你可能会超载推送:

push(T[] items)

我假设您需要此功能,以便您可以将这些作为单个项目推送到堆栈,而不是因为您需要异构容器。在此推送中,您可以迭代数组中的每个项目并将其存储到内部存储中。

答案 3 :(得分:0)

您可以使用此类模板的部分特化来处理数组:

template <typename T>
class Stack <T*>
{
 //other stuff
};

但是我不确定你的编译器是否支持它,因为vc ++ 7.0不支持部分模板规范,后来的版本可能支持它。

据我所知,linux gnu 8.2 GNU c ++支持它。