我想使用c++模板创建一个泛型堆栈。栈的push方法的原型由Void push( t* ptr)给出,其中t是模板参数。现在指针ptr可能指向一个整数或整数数组,它可能指向单个字符或字符数组,它可能指向单个双精度数或双精度数组等等。我想要的是,我想要在push方法中分配内存如果ptr指向一个整数,那么我需要根据整数的大小分配内存,如果ptr指向整数数组,那么我需要根据数组的大小分配内存。类似地,对于其他原始数据类型,我的问题是如何确定这个指针ptr指向一个数组还是一个简单的变量。如果不可能发现一个指针指向一个数组或一个简单的变量,那么建议一种我可以用来编写这个堆栈的push方法的技术。
发布于 2009-12-27 03:14:55
您所建议的不是一个好主意--在C++中不可能检测到指针是指向单个实例还是数组,但是这两个指针需要区别对待。
就我个人而言,我会使用std::stack适配器,它是C++标准的一部分。
发布于 2009-12-27 03:14:55
一旦数组“衰减”到指针,就不可能推断T*指向的数组的大小。
考虑让堆栈类型接受一对指针,一个指向数组中的第一个元素,另一个指向数组中的最后一个元素。或者,有一个重载的push方法-一个接受单个指针,另一个接受单个指针和size_t,告诉你有多少对象被指向。
我有点困惑,为什么你有一个T*作为参数。为什么不采用T,就像大多数stl容器上的"add“操作一样?在此期间,您是否知道std::stack的存在(它是stl中的“容器适配器”)?即使您有充分的理由重新实现它,查看STL中的API设计示例也是一个好主意。
发布于 2009-12-27 03:50:31
你的编译器已经负责分配和复制了。如果您这样定义推送:
push(T item)编译器将为您复制项目,您可以将其填充到您的内部存储中。
另外,int和int[]是两种截然不同的类型。如果您想专门创建一个可以接受T[]的堆栈,您可以重载推送:
push(T[] items)我假设您需要此功能,以便可以将这些项作为单独的项推送到堆栈上,而不是因为您想要一个异构容器。在此推送中,您可以迭代数组中的每一项并将其存储到您的内部存储中。
https://stackoverflow.com/questions/1964082
复制相似问题