C++ 使用枚举值和可变模板制作constexpr二进制掩码

C++ 使用枚举值和可变模板制作constexpr二进制掩码,c++,variadic-templates,constexpr,bitmask,C++,Variadic Templates,Constexpr,Bitmask,我正在尝试创建一个类,用于从枚举值生成constexpr位掩码 但是,我在下面的代码中遇到了几个编译错误,尤其是: makeMask(args…有“预期的”)”错误 FruitMask不能是常量表达式 我做错了什么 enum Fruit { Banana, Apple, Orange, Kiwi, Coconut, Strawberry }; struct FruitMask { static constexpr int makeMa

我正在尝试创建一个类,用于从枚举值生成constexpr位掩码

但是,我在下面的代码中遇到了几个编译错误,尤其是:

  • makeMask(args…
    有“预期的”)”错误
  • FruitMask
    不能是常量表达式
我做错了什么

enum Fruit
{
    Banana,
    Apple,
    Orange,
    Kiwi,
    Coconut,
    Strawberry
};

struct FruitMask
{
    static constexpr int makeMask() { return 0; }
    template<typename ... Args> static constexpr int makeMask(Fruit fruit, Args ... args)
    {
        static_assert((int)fruit< (sizeof(mask)*8), "Mask values too large");
        return (1 << (int)mode) | makeMask(args ...);
    }
    template<typename ... Args> constexpr FruitMask(Args ... args) { mask = makeMask(args...); }
    int mask;
};

static constexpr const FruitMask ExoticFruitMask = FruitMask(Banana, Coconut);
枚举水果
{
香蕉,
苹果,
橙色
几维鸟,
椰子,
草莓的
};
结构水果面膜
{
静态constexpr int makeMask(){return 0;}
模板静态constexpr int makeMask(水果、水果、Args…Args)
{
静态断言((int)水果<(掩码大小)*8),“掩码值太大”);

return(1我不确定您是否可以通过它进行静态断言,但是您可以使用
return((1如果没有静态_断言,我会有同样的错误,所以我对它进行了注释。它仍然无法编译。它只是作为一种保险,Fruit类不能超过可用的位数。我已经让它工作了:@KIIV-有趣…你的代码用C++20(C++2a)编译)但对于C++17来说不是这样。C++20中有什么变化使此代码有效?此折叠表达式在gcc 6.1 C++17上编译:
return(…|)(1