簡體   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