简短版本:无论如何在类中嵌套函数,enum
以便EnumClass::EnumLabel
您可以拥有有用的相关函数,例如EnumClass::to_string(EnumClass value)
而不是拥有全局函数EnumClass_to_string(EnumClass value)
。
长版:所以我在玩 OpenGL,它带有一堆整数#defines
,用于 GPU 上的各种功能。为了 C 兼容性,这些定义在其标签之外没有真正的结构,因此很容易使用不正确的定义。为了帮助纠正这个新手错误的来源,我一直在将相关定义分组到enum
类中,如下面的调试消息源示例:
enum class Source {
API = GL_DEBUG_SOURCE_API,
WINDOW_SYSTEM = GL_DEBUG_SOURCE_WINDOW_SYSTEM,
SHADER_COMPILER = GL_DEBUG_SOURCE_SHADER_COMPILER,
THIRD_PARTY = GL_DEBUG_SOURCE_THIRD_PARTY,
APPLICATION = GL_DEBUG_SOURCE_APPLICATION,
OTHER = GL_DEBUG_SOURCE_OTHER
};
由于这些通常用于调试输出,因此我决定创建一个to_string
函数来简化将它们的含义输出到日志文件。
std::string source_to_string(KHR_debug::Source source) {
if(source == KHR_debug::Source::API) {
return "GL_DEBUG_SOURCE_API";
} else if(source == KHR_debug::Source::WINDOW_SYSTEM) {
return "GL_DEBUG_SOURCE_WINDOW_SYSTEM";
} else if(source == KHR_debug::Source::SHADER_COMPILER) {
return "GL_DEBUG_SOURCE_SHADER_COMPILER";
} else if(source == KHR_debug::Source::THIRD_PARTY) {
return "GL_DEBUG_SOURCE_THIRD_PARTY";
} else if(source == KHR_debug::Source::APPLICATION) {
return "GL_DEBUG_SOURCE_APPLICATION";
} else if(source == KHR_debug::Source::OTHER) {
return "GL_DEBUG_SOURCE_OTHER";
} else {
return "INVALID_SOURCE_ENUM";
}
}
但是,我认为如果我可以将辅助函数嵌套在enum
类本身中会更整洁。这样source_to_string(source)
您就可以使用Source::to_string(source)
. 我很欣赏这个功能,如果你使用旧式enum
类,你只需将你的类包装enum
在一个类/结构中,但是我使用 C++11enum
类的原因之一是因为它们增加了类型安全性。
我尝试在类旁边有一个类/命名空间,enum
但这似乎覆盖了现有定义之一。