Предположим, у меня есть такой код:
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: другие вопросы, такие как используя объявление с enum? обрабатывать случай, когда перечисление находится в классе, а не непосредственно в пространстве имен.
Этот способ требует небольшого объема работы в пространстве имен foo. Но он должен быть прозрачным для существующего пользователя 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 в пространство имен foo — только там вы добавляете / модифицируете / удаляете значения перечисления. Это безопаснее, я верю. Его недостатком по сравнению с другим ответом является то, что вы должны изменить другой файл, который не может быть опцией.
Это будет работать
struct baz
{
typedef foo::bar bar;
static const bar fooBarA = foo::fooBarA;
static const bar fooBarB = foo::fooBarB;
// This is now valid
bar returnSomething() { return fooBarA; }
};
но я не знаю, действительно ли это полезно. Если ваши пользователи пытаются перегрузить некоторые функции или что-то еще, они могут быть удивлены.