我正在编写一个小型玩具项目(数据结构),其中我有一组常量,我想将它们捆绑在位于主类中的匿名结构中。此类使用一些常量来声明静态数组的大小。 它看起来有点像这样:
template< class T, size_t K >
class Tree {
static struct {
size_t const min_keys{ K };
size_t const max_keys{ 2*K };
...
} const constants;
...
};
K
是一个模板参数,struct的所有成员都是const。但是,编译器(我使用的是 g++ 5.1)在声明静态数组时会报错。
bpt.h:34:34: error: size of array is not an integral constant-expression
T keys[constants.max_keys];
这让我很困惑——一切都是const
。我只是想清理我的常量,像这样将它们捆绑起来似乎既理想又有趣。使用枚举类也很好,但由于该类还需要与这些常量进行比较,所以这是不可能的。现在我正在使用一个确实有效的匿名枚举,但这激起了我的好奇心。
这是为什么?这是一个坏主意吗?我是 C++ 的新手 – 我很高兴看到替代方案。
最佳答案
以下代码有效:
#include <cstddef>
#include <iostream>
template <typename T, std::size_t K>
struct Tree {
static constexpr struct {
// ^^^^^^^^^
std::size_t const min_keys{ K };
std::size_t const max_keys{ 2*K };
} constants {};
// ^^^
};
示例用法:
int main()
{
int foo[Tree<int, 20>::constants.min_keys] = {1, 2};
}
重点是制作Tree::constants
一个constexpr
静态数据成员,这意味着它的成员是常量表达式,可以用作数组大小。注意:
static constexpr 成员需要初始化器,因此
{}
(或者我们可以将{K, 2 * K}
放在这里并省略大括号或等号初始值设定项)。只要不对静态 constexpr 成员进行 ODR 使用(例如,不要尝试计算
&Tree<int, 3>::constants
),就不需要定义静态 constexpr 成员。这很方便。
关于c++ - 在数组声明中使用常量结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31493886/