2009-12-26 203 views
1

我想使用C++模板制作一个通用堆栈。堆栈推送方法的原型由以下公式给出: Void push(t * ptr) 其中,t是模板参数。现在指针ptr可能指向一个整数或整数数组,它可能指向单个字符或字符数组,它可能指向单个双数或双精度数组等。 我想要的是,我想要在push方法中分配内存,如果ptr指向一个整数,那么我需要分配内存相对于整数的大小,如果ptr指向整数数组,然后我需要根据大小分配内存阵列。同样对于其他基本数据类型 我的问题是如何确定这个pointe ptr是指向一个数组还是一个简单的变量。如果不可能发现指针指向一个数组或一个简单的变量,则建议一种技术,通过该技术我可以编写该堆栈的推送方法。字符堆栈,字符串堆栈,整数堆栈,整数数组堆栈等

+0

你想让你的堆栈包含推送它的副本吗?或者将获得传递给它的指针的所有权? – 2009-12-26 19:38:45

+0

是的是的确切 – 2009-12-26 20:12:53

+0

我想在堆栈中有东西的副本 – 2009-12-26 20:16:33

回答

0

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

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

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

2

你提出的建议不是一个好主意 - 它不可能在C++中检测指针是指向单个实例还是数组,但是这两者需要区别对待。

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

0

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

push(T item) 

编译器会为你复制项目,你可以将它填充到你的内部存储中。

另外,int和int []是两个不同的类型。如果你想专门做一个堆栈可以接受的T [],你可以做推过载:

push(T[] items) 

我假设你想要这个功能,这样就可以作为单独的项目推这些压入堆栈,不是因为你想要一个异构容器。在这个推动中,您可以遍历数组中的每个项目并将其存储到内部存储中。

0

您可以使用模板的偏特喜欢这个数组的堆栈:

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

但我不知道你的编译器支持与否,因为部分模板特化在VC++ 7.0不支持,以后的版本可能有它的支持。

我尽我所知linux gnu 8.2 GNU C++支持它。