gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:53:11 25 4
gpt4 key购买 nike

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

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

class Object {
Color color;
Shape shape;
public:
};

为了使用Object在像 std::map<> 这样的 STL 容器中我需要重载小于运算符。但是,为了将两个枚举类展平为一个线性索引,我不知何故需要枚举类的元素数 (NoE):

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

如果不在程序的两个地方以一种很好的方式输入相同的信息(元素数量),如何做到这一点? (好的方法意味着没有 FIRST_ELEMENT, LAST_ELEMENT ,预处理器魔术等)

问题 ( Number of elements in an enum ) 类似但没有解决 enum classes .

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

enum class Color {RED=0, GREEN=1, BLUE=2};
enum class Shape {SQUARE=0, CIRCLE=1, TRIANGLE=2};

最佳答案

正如评论和其他人已经指出的那样,优先考虑 ShapeColoroperator<并且只有在第一个相等的情况下才比较另一个。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);
}

关于c++ - 从两个枚举类创建复合类型,为 STL 映射做好准备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16340680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com