c++ - 在数组声明中使用常量结构成员

标签 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是一个模板参数,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/

相关文章:

c++ - ADO流无法保存从数据库加载的BLOB

c++ - 在 C++ 中是否可以禁止在编译时调用某个函数?

javascript - 如果值相等则映射整个数组

go - 如何定义go struct的key和value

c - 为什么可以使用 typedef 的名称作为结构成员的名称?

c++ - SDL 鼠标点击

c++ - 处理 .wav 文件期间输出失真

C++ 指针动态数组和函数

python - 在循环的条件语句中调用 len() 可以吗?

struct - 如何从元组结构中提取值?