有一个函数共享一个枚举类命名空间的方法?

MrB*_*ido 2 c++ c++11

简短版本:无论如何都要在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它应该的位置:)