使用带值传递和函数返回的枚举的正确方法?

rub*_*nvb 3 c++ enums struct namespaces c++11

我明白问题标题是模糊的,因此正文:)

我有几个enum用于识别文件类型和其他需要轻松区分的东西.我以前的做法是这样的:

namespace my_namespace
{
    namespace fileType
    {
        enum fileType
        {
            SOURCE,
            HEADER,
            RESOURCE
        };
    }
}
using namespace my_namespace::fileType;
Run Code Online (Sandbox Code Playgroud)

这让我可以定义一个函数:

fileType someFunction( const std::string &someFile, const fileType someType )
{
    //...
    return fileType::HEADER;
}
Run Code Online (Sandbox Code Playgroud)

我可以像这样定义和比较变量:

fileType type = fileType::SOURCE;
Run Code Online (Sandbox Code Playgroud)

哪个很棒.虽然有一些警告.标题(没有任何using指令)需要加倍预期的枚举名称,让编译器知道你使用的是类型,而不是命名空间:

my_namespace::fileType::fileType soeFunction( const std::string &someFile, const my_namespace::fileType::fileType someType );
Run Code Online (Sandbox Code Playgroud)

哪个看起来很傻,难以阅读,难以理解.此外,MSVC在警告级别1处抱怨使用的非标准扩展(由于fileType示例中的doule ).奇怪的是,海湾合作委员会并没有在最严格的环境下抱怨,但嘿,这是一个不同的故事.

我现在想要以enum一种方式重写我的s(它们是匿名的)包含在结构而不是命名空间中,允许在声明函数时进行单一限定,从而关闭MSVC的警告.但是return在这种情况下如何编写语句.是否绝对有必要提供构造函数/转换运算符,或者有没有办法解决这个问题?

例:

// enum definition
namespace my_namespace
{
    struct fileType
    {
        enum
        {
            SOURCE,
            HEADER,
            RESOURCE
        };
    }
}
using my_namespace::fileType;

// function declaration in header
my_namespace::fileType someFunction( const std::string &s, const my_namespace::fileType type );

// function implementation in .cpp file
using my_namespace::fileType;

fileType someFunction( const string &s, const fileType type )
{
    //...(problem is situated below)
    return fileType::SOURCE;
}
Run Code Online (Sandbox Code Playgroud)

这说明了我想做的事情.我想避免明确地调用enum struct的构造函数:fileType(fileType::SOURCE)这会让我有双重fileType用途.

谢谢您的帮助!

PS:如果之前已经回答过这个问题,我很抱歉,但是我没有找到谷歌或之前关于这个主题的问题的好选择.

Mat*_* M. 10

我个人使用一个非常简单的技巧:

struct EnumName
{
  enum type {
    MemberOne,
    MemberTwo,
    ...
  };
};

typedef EnumName::type EnumName_t;

// Usage
EnumName_t foo = EnumName::MemberOne;
Run Code Online (Sandbox Code Playgroud)

在C++ 0x中,您可以直接使用作用域枚举器:

enum struct EnunName // note: struct and class equivalent here
{
  MemberOne,
  MemberTwo,
  ...
};

// Usage
EnumName foo = EnumName::MemberOne;
Run Code Online (Sandbox Code Playgroud)

这真的很棒:)

注意:scoped enum也不受整体推广的影响,这真的很棒