gpt4 book ai didi

c++ - 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?

转载 作者:行者123 更新时间:2023-11-30 01:01:32 24 4
gpt4 key购买 nike

我有一个大小为 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。

最佳答案

不,这通常是不可能的。

首先,您需要了解模板在编译时的所有实例化。如果您不打算实例化 std::array<double, DIMENSIONS>对于 DIMENSIONS 的每个值可以使用,那么这已经取消了任何解决方案的资格。

即使您已经为 DIMENSIONS 的每个可能值实例化了,您不能拥有全局静态 std::array对象有它的大小变化。

原则上你可以放置新一个不同的对象 std::array输入 arr 占用的存储空间, 但这将需要声明它已经具有 DIMENSIONS 允许的最大值的大小首先,它还需要携带数组的大小,以便在任何地方都以正确的类型访问它,并使访问它的每个代码都以此为条件。

C++17 提供 std::variant它封装了这个,但只有 C++11 看起来不会很好(至少没有 boost 的帮助),所以我跳过它。

但最终它会变得过于复杂并且会生成非常大的二进制文件。你应该简单地使用 std::vector而不是 std::array .

如果您想允许 DIMENSIONS 的任意值, 那么这将是不可能的。

关于c++ - 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59013348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com