обертка для создания анонимных перечислений - PullRequest
0 голосов
/ 28 января 2020

У меня есть некоторые перечисления typedef'd, включенные из c -кода, т.е. они доступны в виде

typedef enum {FOO=3, BAR=5} my_enum; 

, и я хотел бы использовать его в коде C ++ безопасным образом, пока оставляя enum имена (FOO и BAR) и значения (3 и 5) и их связь без изменений.

Существуют ли какие-либо передовые практики или шаблоны, такие как обертки шаблонов, которые можно рекомендовать для достижения sh, скажем, в C ++ 11 или выше?

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Кажется, что объявление

using

работает; по крайней мере следующие компиляции:

#include <iostream>

typedef enum{A=0, B=1, C=2} my_enum;
typedef enum{H=0, I=1, J=2} your_enum;

using namespace std;
using my_wrapper = my_enum;
using your_wrapper = your_enum;

int g(my_wrapper w)
{
    return (int)w-10;
}

int g(your_wrapper w)
{
    return (int)w+10;
}


int main() {
    my_wrapper b=my_wrapper::B;
    your_wrapper j=your_wrapper::J;
    cout << g(b) << "\n";
    cout << g(j) << "\n";
}
0 голосов
/ 28 января 2020

В C ++ 11 и выше вы можете объявить эти типы как enum class, чтобы получить безопасность типов, но вы должны квалифицировать использование с именем enum.

enum class my_enum {
    FOO=3,
    BAR=5
};

void my_func(my_enum e) {

}

int main() {
  my_enum test_enum = my_enum::FOO;
  my_func(test_enum);
}

Если мы изменили Приведенное выше определение от test_enum до my_enum test_enum = FOO; приведет к ошибке:

13:23: error: 'FOO' was not declared in this scope

...