从两个枚举类创建复合类型,为STL映射做好准备

rit*_*ter 11 c++ enums stl c++11

我想用两个创建一个复合类型enum classes.

enum class Color {RED, GREEN, BLUE};
enum class Shape {SQUARE, CIRCLE, TRIANGLE};

class Object {
  Color color;
  Shape shape;
public:
};
Run Code Online (Sandbox Code Playgroud)

为了Object在STL容器中使用,std::map<>我需要重载less-than运算符.但是,为了将两个枚举类压缩成一个线性索引,我不知何故需要枚举类的元素数(NoE):

friend bool operator< (const Object &lhs, const Object &rhs) {
  return NoE(Shape)*lhs.color+lhs.shape < NoE(Shape)*rhs.color+rhs.shape;
}
Run Code Online (Sandbox Code Playgroud)

如果不以一种很好的方式在程序中的两个位置输入相同的信息(元素数量),怎么做呢?(好的方式意味着没有FIRST_ELEMENT, LAST_ELEMENT,预处理器魔术等)

问题(枚举中的元素数量)类似但未解决enum classes.

我想知道在C++ 11中实现这种复合类型的最佳方法是什么.枚举类定义是否足够强大,还是有必要说:?

enum class Color {RED=0, GREEN=1, BLUE=2};
enum class Shape {SQUARE=0, CIRCLE=1, TRIANGLE=2};
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 15

正如其他人已经说过的那样,如果第一个是相等的,则给予其中任何一个Shape或Color在其中的优先权,operator<并且仅比较另一个.对于另一种实现operator<使用std::tie:

#include <tuple>
friend bool operator<(const Object& lhs, const Object& rhs)
{
    return std::tie(lhs.color, lhs.shape) < std::tie(rhs.color, rhs.shape);
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*lds 7

考虑简单地使用std::tuple<Color, Shape>"复合枚举".这将使用已经为您定义的比较运算符,使用字典排序.例如,有效代码:

bool b = std::make_tuple(Color::RED, Shape::CIRCLE)
       < std::make_tuple(Color::GREEN, Shape::SQUARE);
Run Code Online (Sandbox Code Playgroud)