簡體   English   中英

是否可以遍歷 constexpr 函數中的枚舉成員,因此值是 constexpr?

[英]Is it possible to iterate through enum members in a constexpr function, so the values are constexpr?

假設我想創建一個可以將可變寬度整數存儲在一起的通用系統。 在這個系統中,我們可以使用一個enum ,它包含成員名稱(這個 enum 成員有連續的值[0;count) ):

enum class Group1 {
    AttrA,
    AttrB,
    AttrC,
};

我添加了inline constexpr專業化,它告訴我們有多少成員:

template <typename TYPE>
inline constexpr int count = -1;

template <>
inline constexpr int count<Group1> = 3; // Group1 has 3 members (AttrA/B/C)

我添加了描述每個成員寬度的inline constexpr專業化:

template <auto VALUE>
inline constexpr int nBits = -1;

template <>
inline constexpr int nBits<Group1::AttrA> = 3; // AttrA need 3 bits of storage
template <>
inline constexpr int nBits<Group1::AttrB> = 2;
template <>
inline constexpr int nBits<Group1::AttrC> = 4;

現在,我想要一個通用的constexpr函數,它可以計算總寬度(任何類型,而不僅僅是Group1 ):

template <typename TYPE>
constexpr int summedWidth() {
    int r = 0;
    for (int i=0; i<count<TYPE>; i++) {
        r += nBits<static_cast<TYPE>(i)>;
    }
    return r;
}

但是,這不會編譯,因為r += nBits...行:

錯誤:非類型模板參數不是常量表達式

是否可以創建可編譯的summedWidth()函數(或提供編譯時常量的任何其他解決方案)?

使用std::make_integer_sequencecount<TYPE>展開成一個可以折疊的包:

template <typename TYPE, int... ints>
constexpr int summedWidthHelper(std::integer_sequence<int, ints...>) {
    return (0 + ... + nBits<static_cast<TYPE>(ints)>);
}

template <typename TYPE>
constexpr int summedWidth() {
    return summedWidthHelper<TYPE>(std::make_integer_sequence<int, count<TYPE>>{});
}

Coliru 鏈接: http ://coliru.stacked-crooked.com/a/28df4b17d071f6e5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM