是否可以在constexpr函数中迭代枚举成员,因此值是constexpr?

时间:2017-10-25 01:01:15

标签: c++ c++17

假设我想创建一个可以将可变宽度整数存储在一起的通用系统。在这个系统中,我们可以使用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()函数(或任何其他提供编译时常量的解决方案)?

1 个答案:

答案 0 :(得分:2)

使用AWSSecurityTokenServiceClientstd::make_integer_sequence扩展为可折叠的包:

count<TYPE>

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