遵循我在这里已经描述过的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; }
};