【问题标题】:Using constant struct members in array declaration在数组声明中使用常量结构成员
【发布时间】:2015-07-18 17:51:34
【问题描述】:

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

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++ 很陌生——我很高兴看到替代品。

【问题讨论】:

  • Cannot reproduce -- 获得更好的编译器?
  • 这里也一样,您在 MSVS2013 上为我编译的内容。你在用什么?此外,是否有代码用于创建未在此处显示的实例?
  • 但是请注意,您可能必须在某些时候为静态常量成员提供定义,并且这样做,如果您不提供类型,您可能会发现说出它的类型很尴尬一个名字。或者,将静态成员设为constexpr,在这种情况下,您也可以将成员值用作常量表达式。
  • @Kerrek SB:你甚至试图重现它。关键在于额外的代码T keys[constants.max_keys]; 声明。这就是你必须编译的。
  • @AnT:使用constexpr。并且 OP 的代码不包含有问题的示例!

标签: c++ arrays struct enums


【解决方案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 成员,就不需要定义它(例如,不要尝试计算 &amp;Tree&lt;int, 3&gt;::constants)。这很方便。

【讨论】:

  • @eudaemonia:没问题。我仍然认为不给内部类命名会影响可读性,但它确实有效。如果它解决了你的问题,那就去吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2013-09-07
  • 1970-01-01
相关资源
最近更新 更多