假设我的代码是这样的:
namespace foo {
enum bar
{
fooBarA,
fooBarB
};
}
struct baz
{
// TODO: map "bar" in this struct to make valid:
bar returnSomething() { return fooBarA; }
};
// and also this:
void doSomething()
{
baz myBaz;
if( baz::fooBarA == myBaz.returnSomething() )
{ /* ... */ }
}
我可以在TODO部分中放入哪种代码以使其余代码有效?一些
using
或typedef
吗?PS:为避免有关“为什么”的问题:命名空间存在于其自己的头文件中,可能由几个应同意
fooBarA
和fooBarB
值的几个不同的类使用,但同时也隐瞒了它们基于foo
,因为与使用baz
的人无关。PPS:允许使用C++ 11。
enum class
对您有帮助吗?PPPS:诸如using declaration with enum?之类的其他问题处理的情况是枚举在类中而不是直接在 namespace 中。
最佳答案
这种方式需要在foo namespace 中进行少量工作。但是它对foo::bar的现有用户应该是透明的。只需将foo::bar的值包含在某些结构中即可从其派生baz类:
namespace foo {
struct barValues
{
enum Values {
fooBarA,
fooBarB
};
};
typedef barValues::Values bar;
static const bar fooBarA = barValues::fooBarA;
static const bar fooBarB = barValues::fooBarB;
}
struct baz : foo::barValues
{
typedef foo::bar bar;
bar returnSomething() { return fooBarA; }
};
// and also this:
void doSomething()
{
baz myBaz;
if( baz::fooBarA == myBaz.returnSomething() )
{ /* ... */ }
if( foo::fooBarA == myBaz.returnSomething() )
{ /* ... */ }
}
与其他答案相比,它的优势在于您可以将foo::bar值包含在 namespace foo中-仅在其中添加/修改/删除此枚举值。我相信这是更安全的。与其他答案相比,它的缺点是您必须修改其他文件,而这不是一个选择。
关于c++ - 在类中映射命名空间的枚举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12446437/