好吧,所以我试图通过初始化一堆来做一些聪明的事情constexpr static int const
编译时的数组。尽管运行时性能根本不受初始化这些数组的控制,但这似乎是一个有趣的小练习。我写了一个测试设置来看看是否可行,最终我能够做到这一点:
struct Test
{
constexpr static int const array[10] = Array<int, 10, 0, Increment>::array;
};
constexpr int const Test::array[10];
int main()
{
cout << Test::array[3] << '\n';
}
Here, Array
有一个名为的静态成员array
其中包含 10int
s,从 0 开始,其中每个后续元素的值由称为模板元编程函子确定Increment
(i.e. {0, 1, ..., 9}
)。正如预期的那样,程序打印出数字3
.
太棒了,对吧?我现在可以编写函子并在编译时初始化各种时髦模式的数组。下一步:通过以下方式对数组大小 10 进行硬编码Test
像这样的类模板:
template <size_t Size>
struct Test
{
constexpr static int const array[Size] = Array<int, Size, 0, Increment>::array;
};
template <size_t Size>
constexpr int const Test<Size>::array[Size];
int main()
{
cout << Test<10>::array[3] << '\n';
}
然而,突然间它不再编译并显示以下消息:
test.cc:43:72: error: array must be initialized with a brace-enclosed initializer
为什么会发生这种情况?一旦我将类转换为类模板,这种初始化是否会变得无效,或者我是否偶然发现了 GCC 中未实现/有缺陷的东西?
仅供参考,我可以发布我的其余代码(Array
例如)根据要求。目前我认为这应该足够了。
EDIT该错误可以通过不同的、简单的实现来重现Array
在这里节省一些空间:
template <size_t Size>
struct Array
{
constexpr static int const array[Size] = {};
};
template <size_t Size>
struct Test
{
constexpr static int const array[Size] = Array<Size>::array;
};