【发布时间】:2021-08-10 10:07:46
【问题描述】:
据我所知,目前在 c++ 中没有对此的支持。
例如,
class C{
struct{
enum {defaulted, opt1, opt2, ...} flag1;
enum {defaulted, optA, optB, ...} flag2;
} flags;
...
};
现在假设我们有C obj,使用标志可以做到
obj.flags.flag1 = obj.flags.opt1;
这是不必要的冗长。
但是由于obj.flags.flag1 的类型是已知的,理论上编译器可以在该范围内查找名称opt1 并节省一些输入。
因为标志不在其他任何地方使用,所以最好不要给类型命名(实际上很难找到合适的名称)。 c++20 中的using enum 语法不能解决这个问题,因为:它 1) 需要命名 enum 类型; 2)using 多个enums 可能会导致名称冲突,如此处所示,因为两个enums 都有一个defaulted 成员。
实施这个会有什么困难?这是否已向 C++ 标准委员会提出和/或在某些编译器中实现?
【问题讨论】:
-
您对命名范围枚举的论点有点没有实际意义。在您的示例中,两个枚举都有一个
defaulted并且如果不给枚举命名,您将无法区分它们。在您尝试不那么冗长之前,这已经是一个问题 -
简短回答:不,如果不对 C++ 类型系统和表达式的工作进行重大更改,就无法完成。赋值表达式的行为由其两个操作数的类型决定。对于分配
a = b,首先确定a和b的类型,如果b的类型与b的类型相同,或者可以隐式转换为a的类型。您正在寻找根本不同的东西 - 检查a的类型,然后使用它来推断解释b的一些上下文。 -
@Peter Great。你能写一个答案让我接受吗?
标签: c++ enums scope language-lawyer