创建可以是多种类型的C ++数组

时间:2017-01-12 00:04:55

标签: c++ arrays pointers object if-statement

我有一个返回void*的函数。现在,当此函数完成时,将返回UINT16*数组作为void *。 UINT16数组是在方法的开头创建的,但现在我需要一种方法来确定数组的类型并改为创建该类型。例如,发生了一些数据处理并确定应该创建int类型的数组,因此创建并返回int数组。还可以创建其他类型,如double和byte。

我如何实现这一目标?

我目前的代码

UINT16* data_out = new UINT16[arraySize];   

我知道我可以创建一个大的if / else或switch语句,但我想知道是否有更好的方法。

4 个答案:

答案 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*使用几乎无类型的返回值,但我们假设它有原因。

实际上有两个问题,即创建数组然后使用它。

根据某些逻辑创建不同类型的数组时,您必须以某种方式处理ifswitch();你怎么表达决定所需结果类型的逻辑呢?但是,如果你愿意,你也可以使用像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结果。