gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:09:52 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com