C++ 是否有或是否有c++;要为短枚举值使用上下文?
我在代码中的任何地方都使用C++ 是否有或是否有c++;要为短枚举值使用上下文?,c++,enums,namespaces,c++20,C++,Enums,Namespaces,C++20,我在代码中的任何地方都使用enum类。有时,名称空间会堆积起来,从而降低代码的可读性: _infoSign->setType(ui::InfoSign::Type::Ok); 我知道,我可以通过使用语句来缩短这个时间: using Type = ui::InfoSign::Type; _infoSign->setType(Type::Ok); 使用语句的的缺点是自己对类型的定义。如果enum名称更改为Foo,此代码将保留类型名称,并且必须手动更新 Swift使用一种有趣的方式来处
enum类
。有时,名称空间会堆积起来,从而降低代码的可读性:
_infoSign->setType(ui::InfoSign::Type::Ok);
我知道,我可以通过使用语句来缩短这个时间:
using Type = ui::InfoSign::Type;
_infoSign->setType(Type::Ok);
使用语句的的缺点是自己对类型的定义。如果enum
名称更改为Foo
,此代码将保留类型
名称,并且必须手动更新
Swift使用一种有趣的方式来处理枚举值:
enum CompassPoint{
凯斯北
凯斯南
凯斯东
凯斯韦斯特
}
func-foo(目录:CompassPoint){
// ...
}
对于函数调用,编译器将自动使用正确的上下文,并允许使用非常简短的形式指定枚举值:
foo(.north)
<强>是否有一个C++的类似语法建议?< /强>
< p>没有类似的建议,正是我所知道的那个情况。也就是说,减少初始化作用域枚举数时的干扰。它在风格上似乎类似于指定的初始值设定项(对于C++20来说是新的),但有点反对将作用域枚举数。。。你知道的,范围很广
关于枚举类,更常见的问题是switch语句中的冗长。对于这个问题,有一个
std::string_view to_string(rgba_color_channel channel) {
switch (channel) {
case rgba_color_channel::red: return "red";
case rgba_color_channel::green: return "green";
case rgba_color_channel::blue: return "blue";
case rgba_color_channel::alpha: return "alpha";
}
}
到
我想你也可以写:
using enum ui::InfoSign::Type;
_InfoSign->SetType(Ok);
但这并不是说不详细(除非您在同一范围内多次执行该操作) >我最喜欢的解决方案是不建立名字空间堆。我认为不存在一个建议,也不认为C++是可行的:在C++中,通过名称查找发现的函数可能依赖于参数,这太难了,使得后者也依赖于前者。您没有请求解决方案,也没有明确说明为什么您要使用EnUM类。但是,如果您放弃为类成员使用它,您已经可以使用更短的符号和类型安全性。具体来说,C++使用函数的类型来定位函数的命名空间,如果函数定义在那里。恰恰相反。我认为InfoSign::Type
不会变成InfoSign::Foo
产生任何问题。至少如果真的发生了这种情况,我会更关心这个接口的不一致性,而不是我的别名的不一致性。一个新的建议很可能需要解决编译器搜索名称空间的方式。使用参数或左值类型的名称空间将是一个优雅的解决方案。最后,类型必须是兼容的-因此可能会出现错误的值解析,但可能性很小。
using enum ui::InfoSign::Type;
_InfoSign->SetType(Ok);