在数组声明中使用常量struct成员

时间:2015-07-18 17:51:35

标签: c++ arrays struct enums

我正在编写一个小型玩具项目(数据结构),其中我有一些常量集合,我想在一个存在于主类中的匿名结构中进行捆绑。该类使用一些常量来声明静态数组的大小。 看起来有点像这样:

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是一个模板参数,结构的所有成员都是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 ++很陌生 - 我会很高兴看到替代品。

1 个答案:

答案 0 :(得分:1)

以下代码有效:

#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静态数据成员,这意味着其成员是常量表达式,可以用作数组大小。注意:

  • 静态constexpr成员需要初始值设定项,因此{}(或者我们可以将{K, 2 * K}置于此处并且不使用支撑或相等的初始值设定项。)

  • 您不需要静态constexpr成员的定义,只要您不使用它(例如,不要尝试计算&Tree<int, 3>::constants)。这很方便。