我有一个大小为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
非常量非静态,有没有办法将其重新初始化为main()
中的argv[1]
并且arr
仍然正确实例化?我想完成什么的想法:
unsigned int DIMENSIONS;
std::array<double, DIMENSIONS> arr;
// ...
// ...
// ...
int main (int argc, char* argv[]) {
DIMENSIONS = atoi(argv[1]);
}
我想通过命令行控制程序的维度(用于爬山优化(。我知道数组不能具有动态大小调整,除了 VLA 之外,必须在编译时而不是运行时声明其大小。不过,我特别需要一个全局非VLA。
不,这通常是不可能的。
首先,您需要在编译时知道模板的所有实例化。如果您不打算为可以使用的每个DIMENSIONS
值实例化std::array<double, DIMENSIONS>
,那么这已经取消了任何解决方案的资格。
即使你已经实例化了DIMENSIONS
的每个可能值,也不能让全局静态std::array
对象改变其大小。
原则上,您可以将不同std::array
类型的对象放置到arr
占用的存储中,但这需要以DIMENSIONS
允许的最大值的大小声明它,并且还需要携带数组的大小,以便在任何地方使用正确的类型访问它,并使访问它的每个代码都以此为条件。
C++17 提供了封装这一点的std::variant
,但只有 C++11 它看起来并不好(至少没有 boost 的一些帮助(,所以我跳过了它。
但最终它会太复杂,并且会生成非常大的二进制文件。您应该简单地使用std::vector
而不是std::array
.
如果你想允许任意值DIMENSIONS
,那么这是不可能的。
这是一个非常有趣的问题。然而,答案是否定的。
C 数组和std::array
的大小在编译时已知/构造。argv
和argc
直到运行时才知道。真的没有例外,无论如何尝试使用仅在运行时知道的大小可能会产生一些非常糟糕的结果。
如果您想要一个大小长度可变的数组C++,这些是您的选择。
我不确定我是否理解你所说的"我特别需要一个全局非VLA"是什么意思,但是如果你暗示你出于某种原因需要专门std::array
,你可以将std::vector
的元素复制到std::array
中,但请注意,你仍然坚持在编译时知道这些std::array
的大小。
另请注意,在大多数情况下,std::vector
的工作方式与std::array
一样好,除非 API 函数专门接受std::array
或类似奇怪的东西。