假设我想创建一个可以将可变宽度整数存储在一起的通用系统。在这个系统中,我们可以使用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()
函数(或任何其他提供编译时常量的解决方案)?
答案 0 :(得分:2)
使用AWSSecurityTokenServiceClient
将std::make_integer_sequence
扩展为可折叠的包:
count<TYPE>
Coliru链接:http://coliru.stacked-crooked.com/a/28df4b17d071f6e5