Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有或是否有c++;要为短枚举值使用上下文?_C++_Enums_Namespaces_C++20 - Fatal编程技术网

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);