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