如何将int * -or- float *赋给void *并稍后使用结果?

时间:2015-01-12 18:01:31

标签: c++ arrays pointers casting void

我在c ++中很新,我的问题如下:

我需要一个数组,我想要保存值。所有的价值都属于同一类型。 有两种情况:数组应保存int值或浮点数。 当我编译时,我不知道它将是哪种类型,所以它必须在执行程序时定义。

我试过这样的事情:

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

在此之后,我想用这些值计算事物,但我总是得到错误,因为数组仍然无效

2 个答案:

答案 0 :(得分:2)

在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;
}

答案 1 :(得分: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 );