我在c ++中很新,我的问题如下:
我需要一个数组,我想要保存值。所有的价值都属于同一类型。 有两种情况:数组应保存int值或浮点数。 当我编译时,我不知道它将是哪种类型,所以它必须在执行程序时定义。
我试过这样的事情:void* myArray;
int a = 10;
if(something){
myArray = new int[a];
}
else{
myArray = new float[a];
}
在此之后,我想用这些值计算事物,但我总是得到错误,因为数组仍然无效
答案 0 :(得分:2)
在C ++中有几种方法可以做到这一点:
void*
并根据需要添加reinterpret_cast<...>
,union
个数组,其中包含int
和float
,或前两种方法对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 );