【发布时间】:2021-09-08 19:10:20
【问题描述】:
我不知道该怎么说。我有一个枚举,它基本上具有代表其他枚举类型的值。这是针对我正在研究的排序算法(就像购物页面上的过滤器一样)。
所以我说
enum Sorting { COLOR, PRICE };
enum Color { RED, BLUE };
有没有办法在我输入颜色并返回颜色类型的地方制作宏?
#define ENUM_ASSOCIATION(A, B)
#define ENUM_TYPE(A) //returns B from ENUM_ASSOCIATION
enum Sorting{ COLOR, PRICE };
ENUM_ASSOCIATION(COLOR, Color);
enum Color { RED, BLUE };
void someFunc()
{
DoSomething<ENUM_TYPE(COLOR)>();
}
我是 C++ 预处理器的新手,并试图掌握它们。我觉得这应该不会太难完成,但我不确定如何去做,如果可能的话
编辑:
所以这就是我正在使用的。我没有编译错误,虽然我还不能测试它。使用这些宏声明的任何枚举都将使用 Assoc 结构,这可能会也可能不会导致问题。如果是这样,可能只需为每个宏添加一个 AliasName 参数并用它替换 Assoc。
// Allow use of ENUM_ASSOCIATION to create type aliases
#define DECLARE_ENUM_ASSOCIATION(T) template<T> struct Assoc;
// Creates a type alias, allowing to call ENUM_TYPE() and get the type V
// Remember to use only after both T and V have been declared previously
#define ENUM_ASSOCIATION(T, V) \
template<> \
struct Assoc<T> \
{\
using type = V;\
};
#define ENUM_TYPE(T) Assoc<T>::type;
【问题讨论】:
-
为什么不能只输入名称
Color来获取类型Color?为什么你需要一个不同的名字? -
这是一个过于简单的例子,我的大多数枚举值前面都有缩写(SO_COLOR、SO_PRICE 等),我必须将其用作我的团队想要保留的标准。有时我想创建一个名称与类型不同的枚举值
-
@DemonBismuth Imho 只有两个理由更喜欢枚举而不是枚举类:1. 它们可以隐式转换为基础类型,2. 您可以在 C 和 C++ 中使用它们。枚举的缺点是每个枚举常量都只是底层类型的常量,会污染命名空间。为常量名称添加前缀的真正原因是避免名称冲突。出于这个原因,我强烈建议不要违反现有枚举的这些命名约定。如果您引入了 C 代码中未使用的新枚举,请改用枚举类而不添加任何前缀。
-
顺便说一句:使用枚举类,您甚至不需要为您描述的目的使用宏:
enum class Color {Red, Blue}; ... using EnumType = decltype(Color::Red); -
@fabian 是我想要达到的至少可能的目标吗?当然这可能更容易将它们命名为相同的(我将继续使它们成为枚举类),但我也想了解更多关于预处理器的信息。如果这不存在,我会停下来,但这种宏在许多不同的情况下可能很有用。我在虚幻引擎中工作,为了让引擎可以读取任何内容,我必须做大量的变通办法,这令人沮丧,这样的事情可能会在更多方面有所帮助。
标签: c++ filter enums macros preprocessor