如何将 int* -或- float* 分配给 void* 并稍后使用结果?

How to assign int* -or- float* to void* and use the result later?

我是 C++ 新手,我的问题如下:

我需要一个我想要保存值的数组。所有值都是同一类型。 有两种情况:数组应该保存 int 值或 float。 当我编译时,我还不知道它是什么类型,所以它必须在执行程序时定义。

我试过这样的事情:

void* myArray;
int a = 10;
if(something){
    myArray = new int[a];
}
else{
    myArray = new float[a];
}

在此之后我想用这些值计算东西,但我总是会出错,因为数组仍然是空的

在 C++ 中有几种方法可以做到这一点:

  • 您可以使用 void* 并根据需要添加 reinterpret_cast<...>
  • 您可以创建一个包含 union 的数组,其中包含 intfloat,或者
  • 您可以使用模板。

前两种方法是 C 的惯用方法,但不是 C++ 的惯用方法。这两种方法都是可行的,但它们会导致难以理解和维护的解决方案。

第三种方法让你做事非常干净:

template <typename T>
void calc() {
    // You could use std::vector<T> here for even better flexibility
    T* a = new T[10];
    ... // Perform your computations here
    delete[] a;
    // You don't need a delete if you use std::vector<T>
}

int main() {
    ...
    // You can make a type decision at runtime
    if (mustUseInt) {
        calc<int>();
    } else {
        calc<float>();
    }
    return 0;
}
struct calculator : public boost::static_visitor<> {
  void operator()(const std::vector<int>& vi) const {
    // evaluate the array as ints
  }

  void operator()(const std::vector<float>& vf) const {
    // evaluate the array as floats
  }

};

using nasty_array = boost::variant<std::vector<int>, std::vector<float>>;
std::unique_ptr<nasty_array> myArray;
int a = 10;
if (something) {
  myArray.reset(std::vector<int>(a));
}
else {
  myArray.reset(std::vector<float>(a));
}

boost::apply_visitor( calculator(), *myArray );