Перечисление пространства имен перечисления в классе

Предположим, у меня есть такой код:

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? обрабатывать случай, когда перечисление находится в классе, а не непосредственно в пространстве имен.

1

Решение

Этот способ требует небольшого объема работы в пространстве имен 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 — только там вы добавляете / модифицируете / удаляете значения перечисления. Это безопаснее, я верю. Его недостатком по сравнению с другим ответом является то, что вы должны изменить другой файл, который не может быть опцией.

1

Другие решения

Это будет работать

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; }
};

но я не знаю, действительно ли это полезно. Если ваши пользователи пытаются перегрузить некоторые функции или что-то еще, они могут быть удивлены.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector