枚举、类、命名空间和长名称
enum, classes, namespaces and long names
据我所知,与类相关的枚举应该在类中声明,如下所示:
namespace Sensors {
class MySensor {
public:
enum class SensorStatus {
kSensorActive,
kSensorInactive
}
SensorStatus GetCurrentStatus(void);
};
}
我遇到的问题是,它会导致程序的另一部分出现以下代码。
Sensors::MySensor::SensorStatus current_status = mySensor.GetStatus();
switch (current_status):
case Sensors::MySensor::SensorStatus::kSensorActive: // 47 characters!
printf("Sensor is active.");
break;
case Sensors::MySensor::SensorStatus::kSensorInactive: // 49 characters!
printf("Sensor is inactive.");
break;
我很欣赏它非常清楚kSensorActive
和kSensorInactive
指的是什么,没有歧义。但是,如果您尝试遵循指定 80 个字符的样式指南,我们最终会得到很多换行符,恕我直言,这会降低清晰度。如果我们有一个接受两个不同枚举器的函数,则会出现长行的一个例子; MyFunction(NamespaceA::MyFirstClass::MyFirstEnum::AnEnumerator, NamespaceB::MySecondClass::MySecondEnum::ADifferentEnumerator)
- 高达 127 个字符。
这些长名字很常见还是我错过了什么?
首先,你重复一些东西:
如果您已指定名称中的SensorStatus
,则名称kSensorActive
不必说Sensor
。或者,如果Sensor
在MySensor
内,您可以从SensorStatus
中删除它。也许两者都有。
将事物包装在类和命名空间中背后的想法是,您可以一遍又一遍地使用相同的名称,用于"相同类型的东西",而不是始终具有完全唯一的名称。
您也可以在本地使用 using
更改名称,如下所示
using Status = Sensors::MySensor::SensorStatus;
然后我们Status::kSensorActive
你以前使用长东西的地方。
要在不降低整体范围清晰度的情况下缩短长度,您至少有 2 个选项:
- 别名类型即。
using Status = Sensors::MySensor::SensorStatus;
- 一个
typedef
即。typedef Sensors::MySensor::SensorStatus Status2;
在此函数的作用域内使用这些函数,以便它是本地的,并且不明确的名称不会在整个代码中传播。这是一个活生生的例子。
相关文章:
- 如何公开库的枚举,以便我的代码不必键入整个命名空间来使用该枚举?
- 如何理解c++中在命名空间内部定义的枚举类型enum
- C++-使用来自不同头文件、相同命名空间的枚举
- 访问向量字段的键 - 枚举类还是命名空间中的枚举?
- 枚举类不是类或命名空间
- 在命名空间中使用枚举
- 枚举、类、命名空间和长名称
- C++11 枚举类命名空间块
- 类名和枚举值之间的冲突:无需命名空间即可解析
- 命名空间中的doxygen枚举
- 在不膨胀命名空间的情况下在C++中声明枚举的好方法
- 将C++命名空间枚举包装到C接口
- 在类中映射命名空间枚举
- 空的、未命名的枚举说明符的合法性
- 不是创建模板类后的类、命名空间或枚举
- 不同文件中同一命名空间中的 2 个不同枚举中的相同标识符
- 或命名空间中的枚举
- is_error_code_enum<>枚举必须仅在全局命名空间中定义?
- C++ 定义不同命名空间的枚举
- ' static constexpr auto '数据成员初始化为未命名的枚举