【发布时间】:2011-02-28 00:38:49
【问题描述】:
可以在编译时定义一个静态数组,如下:
const std::size_t size = 5;
unsigned int list[size] = { 1, 2, 3, 4, 5 };
问题 1 - 是否可以通过使用各种元编程技术在编译时“以编程方式”分配这些值?
问题 2 - 假设数组中的所有值都是相同的,除了少数几个,是否可以在编译时以编程方式选择性地分配值?
例如:
const std::size_t size = 7;
unsigned int list[size] = { 0, 0, 2, 3, 0, 0, 0 };
- 欢迎使用 C++0x 的解决方案
- 数组可能很大,很少 一百个元素长
- 现在的数组只包含 POD 类型
- 也可以假设大小为 数组将是预先知道的, 在静态编译时兼容 方式。
- 解决方案必须使用 C++ (无脚本、无宏、无 pp 或基于代码生成器的解决方案)
更新: Georg Fritzsche 的解决方案非常棒,需要一些工作才能使其在 msvc 和 intel 编译器上编译,但仍然是一种非常有趣的解决问题的方法。
【问题讨论】:
-
@GMan:图片就像我已经解释过的那样,想知道是否可以在编译时仅使用 c++ 填充静态数组。没有隐藏的议程等。
-
@Hippicoder @GMan 的评论是相关的,因为你不能在 C++ 或 C++0x 中做到这一点。为读者提供上下文,专家会为您找到原始问题的(替代)合适解决方案。
-
假设一个进程需要一个LUT,取决于进程的模式,除了一些值之外,LUT是相同的,所有其他值都是相同的,或者可以通过评估一个简单的序列来生成比如 f(n) = 2*n 或 f(n) = 1 + n 等等...
-
我认为第一个可以使用递归模板并将常量 + 1 传递到每个更深层次。我现在正在调查。
-
@Michael Dorgan:我也想过这个问题,但似乎无法找到正确的方法,我的解决方案涉及从模板结构的枚举中获取值,但是仍然需要我实例化 n 个模板,这大大增加了编译时间。
标签: c++ metaprogramming static-array