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



遵循我在这里已经描述过的c++枚举模式,我试图做类似的事情,但这次我想使用的值序列不能被理解为连续整数。

代码明显错误:

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循环中迭代枚举的值

注意:我希望编译器可以生成所有的代码,至少对于enum类

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

您可能需要查看Better enum。这将使你不必重复任何事情。

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

你可以访问常量的数目

Rotations::_size

目前没有内置的方式来声明默认值。但是,默认构造函数目前是私有的,因此在创建Rotations值时将被迫提供一个值。这里展示了一种语法上"不错"的方法——看看如何使用模板定义invalid。对于你的需求来说,这可能是多余的。如果您尝试此库并对默认值有任何反馈,请告诉我。

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

由于Visual c++ 2010编译工具包的局限性(不完全兼容c++ 11),我不得不放弃自己的低级方法。

在https://stackoverflow.com/a/15961043/383779的帖子也建议我一个有趣的方法来获取值。

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; }
};

相关内容

  • 没有找到相关文章

最新更新