Перечислимый тип с произвольными целочисленными значениями - PullRequest
0 голосов
/ 25 сентября 2010

Я хочу что-то вроде

enum EnumType {val1 = -1, val2 = 1};
enum EnumType2 {val1 = 1, val2 = -1};

В частности, val1 и val2 зависят от перечислимого типа - EnumType или EnumType2.

Так что я в конечном итоге хочу иметь возможность сказать что-то вроде

EnumType x = val1;
EnumType2 y = val1;

и x и y имеют разные значения.

Возможно ли вышесказанное?

Ответы [ 5 ]

1 голос
/ 25 сентября 2010

Ну, val1 и val2 неоднозначны (поскольку они могут относиться либо к EnumType).Вы можете заключить перечисления в namespace или struct, чтобы вы могли различать их следующим образом:

namespace enums1
{
 enum EnumType {val1 = -1, val2 = 1};
}

namespace enums2
{
 enum EnumType {val1 = 1, val2 = -1};
}

Таким образом, вы можете сказать:

enums1::EnumType x = enums1::val1;
enums2::EnumType y = enums2::val1;
0 голосов
/ 25 сентября 2010

Да, но val1 и val2 сами по себе не могут быть целочисленного типа.

enum EnumType { et1_val1 = -1, et1_val2 = 1 };
enum EnumType2 { et2_val1 = 1, et2_val2 = -1 };

struct value_depends_on_conversion {
    EnumType enum1_value;
    EnumType2 enum2_value;

    operator EnumType() const
        { return enum1_value; }

    operator EnumType2() const
        { return enum2_value; }

} const val1 = { et1_val1, et2_val1 },
        val2 = { et1_val2, et2_val2 };

C ++ 0x улучшит это, позволив пометить преобразования constexpr, поэтомуглобальные объекты можно использовать так, как если бы они действительно имели тип enum.

0 голосов
/ 25 сентября 2010

У вас могут быть перечисления с произвольными целочисленными значениями, но вы не можете иметь значения перечислений с тем же именем. Вы должны либо дать им разные имена, либо поместить их в разные пространства имен.

0 голосов
/ 25 сентября 2010

Я могу ошибаться, но я думаю, что неоднозначность в вашем примере может быть решена с помощью EnumType :: val1 и EnumType2 :: val1

0 голосов
/ 25 сентября 2010

Нет, если они имеют одинаковое имя.Если вы дадите им другое имя, вы можете сделать это.Вот как я обычно объявляю перечисления, чтобы они не сталкивались:

enum EnumType {et1_val1 = -1, et1_val2 = 1};
enum EnumType2 {et2_val1 = 1, et2_val2 = -1};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...