非顺序整数 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; }
};
按照我已经在此处描述的 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; }
};