简短版本:无论如何都要在enum类中嵌套函数,以便EnumClass::EnumLabel您可以拥有有用的相关函数,EnumClass::to_string(EnumClass value)而不是具有全局函数EnumClass_to_string(EnumClass value).
长版本:所以我正在玩OpenGL,它带有一堆整数,#defines用于GPU上的各种功能.对于C兼容性,这些定义在其标签之外没有真正的结构,这使得使用不正确的定义变得容易.为了帮助解决这个新手bug的来源,我一直在将相关的定义分组到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
};
Run Code Online (Sandbox Code Playgroud)
由于这些通常用于调试输出,我决定创建一个to_string函数来简化它们对logfiles的意义输出.
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";
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为如果我可以在enum类本身中嵌套该辅助函数,那将会更加简洁.所以,而不是打电话给source_to_string(source)你可以使用Source::to_string(source).我很欣赏这个功能,如果你使用旧式enum类,你只需将你的enum内部包装在一个类/结构中,但是我使用C++ 11 enum类的原因之一是因为它们增加了类型安全性.
我尝试在类旁边有一个类/命名空间,enum但这似乎覆盖了一个现有的定义.
seh*_*ehe 10
这里惯用的事情是使用免费功能:就像你想做的那样
using std::to_string;
int ltuae = 42;
std::cout << "The answer: " << to_string(ltuae) << std::endl;
Run Code Online (Sandbox Code Playgroud)
你可以做
KHR_debug::Source s /* = ... */;
std::cout << "The source: " << to_string(s) << std::endl;
Run Code Online (Sandbox Code Playgroud)
注意 如上所述,它采用了C++的"隐藏"特性:Argument Dependent Lookup.写入
to_string将找到KHR_debug::to_string因为该命名空间包含参数类型.
在科利鲁看到它
#include <iostream>
#include <string>
namespace KHR_debug
{
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 */
};
std::string to_string(Source source) {
switch(source) {
case Source::API: return "GL_DEBUG_SOURCE_API";
case Source::WINDOW_SYSTEM: return "GL_DEBUG_SOURCE_WINDOW_SYSTEM";
case Source::SHADER_COMPILER: return "GL_DEBUG_SOURCE_SHADER_COMPILER";
case Source::THIRD_PARTY: return "GL_DEBUG_SOURCE_THIRD_PARTY";
case Source::APPLICATION: return "GL_DEBUG_SOURCE_APPLICATION";
case Source::OTHER: return "GL_DEBUG_SOURCE_OTHER";
default: return "INVALID_SOURCE_ENUM";
}
}
}
int main()
{
using std::to_string;
int ltuae = 42;
std::cout << "The answer: " << to_string(ltuae) << std::endl;
KHR_debug::Source s = KHR_debug::Source::APPLICATION;
std::cout << "The source: " << to_string(s) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
请注意我如何巧妙地改变你的to_string方法以使用switch它应该的位置:)
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |