我有一个size的全局数组DIMENSIONS
:DIMENSIONS
是一个静态全局变量。我可以更改硬编码DIMENSIONS
变量,而不会在编译或执行中出现问题,但是有没有办法在编译时与运行时确定该值?
const static unsigned int DIMENSIONS = 2;
std::array<double, DIMENSIONS> arr;
// ...
// ...
// ...
int main (int argc, char* argv[]) {
// argv[1] contains value '4'
}
如果我将DIMENSIONS
非常数变为非静态,是否有办法像argv[1]
在中那样重新初始化它main()
并arr
仍然可以正确实例化?我要完成的想法:
unsigned int DIMENSIONS;
std::array<double, DIMENSIONS> arr;
// ...
// ...
// ...
int main (int argc, char* argv[]) {
DIMENSIONS = atoi(argv[1]);
}
我想通过命令行控制程序的尺寸(用于爬山优化)。我知道数组不能具有动态大小调整,除了VLA之外,必须在编译时而不是运行时声明其大小。不过,我特别需要全局非VLA。
不,那通常是不可能的。
首先,您需要在编译时了解模板的所有实例。如果您不打算实例化可以使用的std::array<double, DIMENSIONS>
每个值DIMENSIONS
,那么这已经使任何解决方案都不合格。
即使已为的每个可能值实例化DIMENSIONS
,也无法使全局静态std::array
对象的大小发生变化。
原则上,您可以将不同std::array
类型的对象放置到所占用的存储区中arr
,但这需要先声明允许的最大值,然后再声明DIMENSIONS
数组的大小。为了在任何地方都以正确的类型访问它,并使每个访问它的代码都以此为条件。
C ++ 17提供std::variant
了封装它的方法,但是仅使用C ++ 11时,它看起来就不太好了(至少没有boost的帮助),所以我跳过了它。
但是最后,它将变得太复杂,并且将生成非常大的二进制文件。您应该只使用std::vector
而不是std::array
。
如果您想为允许任意值DIMENSIONS
,那么这将是不可能的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句