是否可以将指向类的指针用作枚举常量?
Is it acceptable to use pointers to class as enum constants?
假设我有一些全局对象:
MyClass* a = new MyClass()
MyClass* b = new MyClass()
MyClass* c = new MyClass()
表示MyClass
的所有有意义状态
是否有很好的理由不按如下方式由它们组成enum ?
enum MyEnum {
A = (int) a,
B = (int) b,
C = (int) c
}
这样,在其他代码中,我可以传递枚举,并转换它:(MyClass*) (MyEnum::A)
不行。枚举数只能用常量表达式初始化,你的变量a
, b
, c
肯定不是。
enum值是编译时常量,而new的返回值是运行时值,因此您甚至不能这样做(加上您可能会在转换为int时丢失一些数据)。我认为对于SO来说,进行冗长的讨论是否可能是个好主意是没有意义的。
正如其他人已经说过的,这是不可能的。但是你可以用单例模式实现类似的东西,例如:
class MyClass
{
public:
enum MyEnum { A, B, C };
static MyClass* getAInstance()
{
static MyClass* a = new MyClass();
return a;
}
static MyClass* getBInstance()
{
static MyClass* b = new MyClass();
return b;
}
static MyClass* getCInstance()
{
static MyClass* c = new MyClass();
return c;
}
static MyClass* getInstance(MyEnum instance)
{
switch(instance)
{
case A:
return getAInstance();
case B:
return getBInstance();
case C:
return getCInstance();
}
}
};
把(MyClass*) (MyEnum::A)
写成MyClass::getInstance(MyClass::A)
。
我很好奇:为什么需要这个实现?顺便说一下,我建议你使用一个向量/数组与函数指针,如果你需要循环的东西。
相关文章:
- 类似枚举的计算常量
- C++ 指向枚举数组的指针
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?
- 相同的枚举项在 SWIG > 2.0.1 中包装在不同类型的常量中
- 大括号使用枚举类初始化静态常量unordered_map
- 将指向类型化/大小的枚举的指针转换为指向基础类型的指针是否安全?
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 扩展 std::to_string 以支持枚举和指针
- C++17:仍然使用枚举作为常量
- 枚举常量在C和C++中表现不同
- 为什么枚举值的initializer_list不被视为常量表达式
- 将C++枚举映射为常量字符*
- 有没有办法不警告 gcc 中开关缺少"COUNT"枚举常量?
- 定义基于模板的映射指针,以便在验证范围时将 int 解析为枚举
- 枚举数组相对于常量和宏的优势
- 使C++软件包和C#软件包访问相同枚举/常量int的最佳方法
- 检测单个枚举常量的类型
- std::min未能将枚举常量解释为有效的整数类型(g++4.6.3)
- 是否可以将指向类的指针用作枚举常量?