gpt4 book ai didi

c++ - 是否可以在 constexpr 函数中遍历枚举成员,因此值是 constexpr?

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:03 25 4
gpt4 key购买 nike

假设我想创建一个可以将可变宽度整数存储在一起的通用系统。在这个系统中,我们可以使用一个包含成员名称的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... 行:

error: non-type template argument is not a constant expression

是否可以创建可编译的 summedWidth() 函数(或提供编译时常量的任何其他解决方案)?

最佳答案

使用 std::make_integer_sequence展开count<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

关于c++ - 是否可以在 constexpr 函数中遍历枚举成员,因此值是 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46922269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com