我有一个返回void*
的函数。现在,当此函数完成时,将返回UINT16*
数组作为void *。 UINT16
数组是在方法的开头创建的,但现在我需要一种方法来确定数组的类型并改为创建该类型。例如,发生了一些数据处理并确定应该创建int类型的数组,因此创建并返回int数组。还可以创建其他类型,如double和byte。
我如何实现这一目标?
我目前的代码
UINT16* data_out = new UINT16[arraySize];
我知道我可以创建一个大的if / else或switch语句,但我想知道是否有更好的方法。
答案 0 :(得分:1)
也许是这样的东西?
这不起作用,但感谢upvote。事实上它可以工作,但你必须知道2> nul
返回的类型才能使用它。但是类型是在Foo
内确定的,这是一个严重的概念缺陷。您应该重新考虑您希望它的工作方式。
Foo
答案 1 :(得分:0)
嗯...对不起,如果这不是一个问题而不是一个评论...:|我不能发表评论。
如果您需要核心解决方案,则可以创建具有不同类型插座的链接列表类。基本上,您将拥有:{/ p>,而不仅仅是UINT_64* next;
int* nextInt;
double* nextDouble;
依此类推。然后,如果你想标记一个双,你可以只使用nextDouble插座。要找到要去哪个出口,只需检查int是否指向任何东西;如果没有,请转到下一步。我知道这似乎是一个非常讨厌和笨重的选择,但我想它确实起到了作用。
答案 2 :(得分:0)
Void *
函数can be fun and do some very interesting有些事情......(很抱歉链接我之前的答案,但这是我遇到的第一个例子。)但他们并非如此安全,并且零类型检查......
因此,在您的情况下,您只需要一个简单的模板函数和auto
关键字。类似的东西:
#include <iostream>
#include <iomanip>
template <typename T>
T * returnAnArray (int size) {
T * data_out = new T[size];
return data_out;
}
int main() {
int size = 3;
auto array = returnAnArray<double>(3);
for(int i=0;i<size;++i)
array[i] = 0;
for(int i=0;i<size;++i){
std::cout << std::setprecision(2);
std::cout << array[i] << std::endl;
}
delete [] array;
return 0;
}
我确实有一些乐趣,并创建了void *
函数:
template <typename T>
void * returnVoidPointerToArray(int size) {
return new T[size];
}
该函数在使用时必须进行强制转换才能返回:
auto chArray = (char*)returnVoidPointerToArray<char>(size);
但输出如下:
5.00
5.00
5.00
ggg
ggg
ggg
Program ended with exit code: 0
注意double是一个单值,但是同样的函数也初始化了一个二维数组的字符......很酷,对吧?尽管如此,它是一种更脏的,不同的模板功能方式。
而且,就像评论者说的那样,使用独特的指针可能是一个好主意。 :)
和其他评论者说的一样,我将数组转换为char *并获得了一个char *数组。 :)
答案 3 :(得分:0)
我不确定为什么你必须使用void*
使用几乎无类型的返回值,但我们假设它有原因。
实际上有两个问题,即创建数组然后使用它。
根据某些逻辑创建不同类型的数组时,您必须以某种方式处理if
或switch()
;你怎么表达决定所需结果类型的逻辑呢?但是,如果你愿意,你也可以使用像result = malloc(nrOfItems*sizeOfItem)
这样的东西,并在你喜欢的任何逻辑上确定sizeOfItem
,即使是基于算术计算。
更有趣或更关键的是调用者如何使用相应函数的结果,因为访问数组的元素需要了解其中元素的类型或大小。
例如,假设以下代码:
void* getSomeItems() {
if (std::rand() > 100000)
return new char[200];
else
return new double[200];
}
int main() {
void* someItems = getSomeItems();
double c = ((double*)someItems)[199]; // Critical!
// how shall we know if element type is double?
// if rand() decided to create items of type char,
// this code accesses non allocated memory
...
因此,除非你的函数可以返回有关已创建的类型的信息(实际上也是数组的大小),否则返回值几乎是不必要的。
我建议不要使用void*
。如果在调用函数之前知道类型,则可以使用模板,向量或其他内容。如果在调用之前不知道类型和/或大小,则返回一个结构 - 除了分配的数组外 - 还提供类型/大小信息。
BTW:最后不要忘记delete[] / free
结果。