C++ constexpr在不进行回归的情况下替换宏
在我们公司的代码中,我们使用64位标志枚举:C++ constexpr在不进行回归的情况下替换宏,c++,macros,constexpr,compile-time,C++,Macros,Constexpr,Compile Time,在我们公司的代码中,我们使用64位标志枚举: enum Flags : unsigned long long { Flag1 = 1uLL<<0, // 1 //... Flag40 = 1uLL<<40 // 1099511627776 }; 但它会产生编译时错误 error: expression '<throw-expression>' is not a constant-expression constexpr函数中的静态
enum Flags : unsigned long long {
Flag1 = 1uLL<<0, // 1
//...
Flag40 = 1uLL<<40 // 1099511627776
};
但它会产生编译时错误
error: expression '<throw-expression>' is not a constant-expression
constexpr函数中的静态断言:
template<unsigned long long I, unsigned long long J>
constexpr unsigned long long SameNum()
{
static_assert(I == J, "numbers don't match");
return I;
}
enum ET : unsigned long long {
ET1 = SameNum<1uLL<<2, 4>(),
ET2fail = SameNum<1uLL<<3, 4>(), // compile time error
ET4 = SameNum<1uLL<<40, 1099511627776uLL>(),
};
constexpr函数中的静态断言:
template<unsigned long long I, unsigned long long J>
constexpr unsigned long long SameNum()
{
static_assert(I == J, "numbers don't match");
return I;
}
enum ET : unsigned long long {
ET1 = SameNum<1uLL<<2, 4>(),
ET2fail = SameNum<1uLL<<3, 4>(), // compile time error
ET4 = SameNum<1uLL<<40, 1099511627776uLL>(),
};
这似乎是一个不发表评论的好理由。为什么您关心基数10的值是109951162776ull?读取或显示以10为基数的位标志似乎是一个可怕的想法。这是我们公司的工作细节。我们的QA——在DB中测试标志的QA——读取我们的.h文件,因此它们更容易使用十进制表示法。您是否考虑过教授QA十六进制?在附近有dec结果更容易。有时我们甚至会有像1这样的标志,这似乎是一个不发表评论的好理由。为什么您关心基数10的值是109951162776ull?读取或显示以10为基数的位标志似乎是一个可怕的想法。这是我们公司的工作细节。我们的QA——在DB中测试标志的QA——读取我们的.h文件,因此它们更容易使用十进制表示法。您是否考虑过教授QA十六进制?在附近有dec结果更容易。有时我们甚至有像1这样的旗帜
int NumbersNotSame() { return 0; }
constexpr unsigned long long SameNum(unsigned long long i, unsigned long long j)
{
return (i == j) ? i : (NumbersNotSame());
}
template<unsigned long long I, unsigned long long J>
constexpr unsigned long long SameNum()
{
static_assert(I == J, "numbers don't match");
return I;
}
enum ET : unsigned long long {
ET1 = SameNum<1uLL<<2, 4>(),
ET2fail = SameNum<1uLL<<3, 4>(), // compile time error
ET4 = SameNum<1uLL<<40, 1099511627776uLL>(),
};