映射/连接两个自动生成的枚举的最佳方法 P> C++中最好的C++连接方式不是11种方式连接自生成类的两个枚举,类似于下面给出的一个: namespace A { namespace B { ... class CarInfo { public: enum State { // basically same enums defined in different classes Running, Stopped, Broken }; }; class BikeInfo { public: enum State { // basically same enums defined in different classes Running, Stopped, Broken }; }; } }

映射/连接两个自动生成的枚举的最佳方法 P> C++中最好的C++连接方式不是11种方式连接自生成类的两个枚举,类似于下面给出的一个: namespace A { namespace B { ... class CarInfo { public: enum State { // basically same enums defined in different classes Running, Stopped, Broken }; }; class BikeInfo { public: enum State { // basically same enums defined in different classes Running, Stopped, Broken }; }; } },c++,enums,type-conversion,C++,Enums,Type Conversion,所需要的是这两个类的统一枚举状态,它与安全类型转换一起被外界看到 我想到的最好也是最简单的方法是创建外部枚举: enum State { Running, Stopped, Broken }; 以及转换函数 State stateEnumConv(A::B::CarInfo::State aState); State stateEnumConv(A::B::BikeInfo::State aState); A::B::CarInfo::State stateEnumConv(Sta

所需要的是这两个类的统一枚举状态,它与安全类型转换一起被外界看到

我想到的最好也是最简单的方法是创建外部枚举:

enum State {
  Running,
  Stopped,
  Broken
};
以及转换函数

State stateEnumConv(A::B::CarInfo::State aState);
State stateEnumConv(A::B::BikeInfo::State aState);
A::B::CarInfo::State stateEnumConv(State aState);
A::B::BikeInfo::State stateEnumConv(State aState);
需要正确的方法


天哪,来自C,我讨厌到处都是长长的名称空间,我希望它只能是A::B级别,就像前面的例子一样。四个转换函数似乎是多余的。请注意,CarInfo::State和BikeInfo::State具有相同的枚举成员。

您可以使用typedef或别名声明来引入此类型

比如说

typedef enum {
  Running,
  Stopped,
  Broken
} State;
您可以使用define

用法示例:

ToGeneric(car->getState()) // with car->getState() which returns A::B::CarInfo::Running
ToSpecialized(CarInfo, Running)
[编辑] 模板版本似乎也能工作:

template <typename T>
State ToGeneric(typename T::State s) { return static_cast<State>(s); }

template <typename T>
typename T::State ToSpecialized(State s) { return static_cast<typename T::State>(s); }

ToGeneric<A::B::CarInfo>(carInfoState);
ToSpecific<A::B::CarInfo>(state);

但是每次也必须为ToGeneric指定类型

生成枚举的是什么?使用什么定义来表示它们是如何生成的?为什么不创建一个基类并将其称为类似于vehicle的东西并在那里定义状态呢?如果状态在类型之间是可转换的,那么为什么还要将其作为子类型呢?为什么不直接使用外部枚举?另外,如果stateEnumConv与类位于同一命名空间中,则不需要到处都是A::B::类。类正在描述示例问题。真正的一个代表沟通框架,我希望尽可能地从中提取,因为项目中几乎所有地方都存在包含问题。此文件是基于xml文件生成的,不可能对其进行更改。A::B命名空间与全局命名空间状态不同,我需要将枚举导入并行枚举。CarInfo和BikeInfo中的状态枚举字段始终保证保持不变;自C++98以来一直有效。不需要别名,我不明白。这不正是引入了第三种类型吗?与我在讨论中所写的完全相同?不加区分地抛出值只是在乞求问题。@CaptainObvlious:我同意,但OP是有限的:他不能使用c++11,不能修改生成器。。。使用C++11或生成器修改,可能会做得更好。@Jarod42:我考虑过这是个好主意。它的C风格。太糟糕了,我在一些汽车C++项目中有很多局限性,尤其是在铸造和预处理器的使用方面。我倾向于进入我提出的解决方案的方向。还有一个问题,我可以避免使用一些模板技巧重新定义几乎完全相同的函数体进行转换吗?@tomlip:在我的解决方案中,我管理所有A::B::*::状态,而无需更多代码。我能回答你的补充问题吗?添加了模板解决方案too@Jarod42:谢谢,这完全回答了我的问题。我将通过使用带有switch case语句的模板定义的转换函数来缩小范围。虽然我真的很喜欢你写的通用版本。可惜我不能投票。现在回到C++中还有很多东西要学习,尤其是泛型类型。
template <typename T>
State ToGeneric(typename T::State s) { return static_cast<State>(s); }

template <typename T>
typename T::State ToSpecialized(State s) { return static_cast<typename T::State>(s); }

ToGeneric<A::B::CarInfo>(carInfoState);
ToSpecific<A::B::CarInfo>(state);