专攻一个枚举

时间:2016-11-03 09:00:14

标签: c++ enums

如何在现代C ++中专门化enum

我发现不仅可以为方法提供专业化,还可以为枚举提供专业化。需要注意的是使用基于枚举的枚举或提供虚拟枚举器,其值等于任何特化提供的最大值。这对我来说很有意义,因为可能有其他成员依赖于枚举的基础类型大小。

只要模板类声明为struct,下面的示例就可以正常工作。一旦我声明它是class,专业化中提供的枚举器就变得无法访问:

test.cc: In function 'int main()':
test.cc:27:20: error: 'Class<3>::Enum Item' is private within this context
  int x = Class<3>::Item;

如何解决这个问题?

SSCCE

template<int i>
struct Class {
public:
    enum Enum {
        // Stretch underlying type (alternatively: use based enum)
        MaxBit = 100
    };

    enum EnumAlternative: int {
        // Like this
    };
};

template<>
enum Class<2>::Enum {
    Item = 12
};

template<>
enum Class<3>::Enum {
    Item = 42
};


int main() {
    int x = Class<3>::Item; // Line 27
}

1 个答案:

答案 0 :(得分:0)

您需要专注于Class 包含您的Enum

template<>
class Class<2>
{
public:
    enum Enum
    {
        Item = 12
    };
};

int main() 
{
    int x = Class<2>::Item; // x with 12
}

现在我们从C ++ 11开始有constexpr variable,请考虑使用它。