Передайте анонимное перечисление в качестве аргумента функции

Можно ли передать анонимное перечисление в качестве параметра функции? Что-то подобное:

class Foo
{
    enum
    {
        One,
        Two,
        Three
    };
};

void Function( /* ??? */ e)
{
    switch (e)
    {
        case Foo::One: // do stuff...
        case Foo::Two: // ...
    }
}

Попытка решения:

Я пытался определить, что это за тип Foo :: One, используя auto и проверяя выведенный тип:

auto u = Foo::One;

Но это оказался Foo<anonymous enum>, поэтому я не могу использовать его в коде.

это перечисление из стороннего источника, поэтому вы не можете его изменить? в противном случае правильным решением было бы просто дать ему имя

Andriy Tylychko 10.09.2018 10:50
3
1
335
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я нашел возможное решение. Уродливо, но работает:

void Function(decltype(Foo::One) e) {}
Ответ принят как подходящий

Вы можете превратить функцию в шаблон функции следующим образом:

template <class Enum> void Function(Enum e)
{
    switch (e)
    {
        case Foo::One: // do stuff...
        case Foo::Two: // ...
    }
}

Его можно создать и вызвать через

Function(Foo::One);

Отлично. Я всегда использую шаблон, когда не уверен, что это за тип. Однако это не всегда уместно.

Nick 10.09.2018 13:28

Другие вопросы по теме