Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ constexpr在不进行回归的情况下替换宏_C++_Macros_Constexpr_Compile Time - Fatal编程技术网

C++ constexpr在不进行回归的情况下替换宏

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函数中的静态

在我们公司的代码中,我们使用64位标志枚举:

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>(),
};