非顺序整数 C++ 枚举的最佳方法是什么

What is the best way for non sequencial integer c++ enums

按照我已经在此处描述的 C++ enum pattern,我试图做类似的事情,但这次我想要使用的值序列不包含连续整数。

代码明显错误:

class Rotations
{
    enum PossibleIndexes
    {
        ZERO,
        PLUS180,
        PLUS90,
        MINUS90
    };


    enum PossibleValues
    {
        ZERO= 0,
        PLUS180= 180,
        PLUS90= 90,
        MINUS90= -90
    };

    static int Count() { return MINUS90 + 1; }

    static PossibleValues Default(){ return ZERO; }
};

因为两个枚举的固有元素之间会有冲突。

所以我的问题是:实现固定数量的硬编码旋转 {0, 180, 90, -90} 的最佳方法是什么,它还具有默认和计数功能?

您始终可以保留包含所有可能值的静态 std::initializer_list

namespace PossibleValues
{
    enum Type
    {
        ZERO= 0,
        PLUS180= 180,
        PLUS90= 90,
        MINUS90= -90
    };

    constexpr auto Values = {ZERO, PLUS180, PLUS90, MINUS90};
    size_t Count() { return Values.size(); }
    Type Default() { return *begin(Values); }
}

这种方法的额外好处是能够在 for 循环中迭代枚举的值

注意:我希望编译器可以生成所有代码,至少对于枚举 class

免责声明:我提到的是我最近发布的一个开源库。

您可能想看看 Better Enums。它将使您不必重复任何事情。

#include <enum.h>
ENUM(Rotations, int, ZERO = 0, PLUS180 = 180, PLUS90 = 90, MINUS90 = -90)

然后您可以访问常量的数量,如

Rotations::_size

目前没有声明默认值的内置方式。但是,默认构造函数当前是私有的,因此您在创建 Rotations 值时将被迫提供一个值。有一种语法 "nice" 的方法可以做到这一点 here – 看看如何使用模板定义无效。它可能完全满足您的需求。如果您试用此库并对默认值有任何反馈,请告诉我。

我应该注意,计数和默认值是在编译时生成的。

由于 Visual C++ 2010 Compilation Toolkit(不完全符合 C++11)的限制,我不得不屈服于劣等方法。

的 post 也向我建议了一种获取值的有趣方法。

class Rotations
{
public:
    typedef enum
    {
        ZERO= 0,
        PLUS180= 180,
        PLUS90 = 90,
        MINUS90 = -90
    }PossibleValues;

    static const PossibleValues PossibleValuesCollection(int index) {
        static const PossibleValues values[] = { ZERO, PLUS180, PLUS90, MINUS90 };

        return values[index];
    }

    static int Count() { return 4; }
    static PossibleValues Default(){ return ZERO; }
};