繁体   English   中英

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

[英]Using constant struct members in array declaration

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

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 ++还是很陌生–我很高兴看到替代方案。

以下代码有效:

#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}放在这里,而忽略括号或相等的初始化器)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM