Можно ли проверить параметры оператора case во время компиляции?

Как я могу переписать этот код таким образом, чтобы пользователю всегда отображалось правильное состояние (CA, AL и т. Д.), Когда он передает правильное направление.

Т.е. как мне убедиться, что для каждого из этих enum_types существует правильный оператор case в перечислении направлений во время компиляции, чем во время выполнения?

За. Например. Я намеренно закомментировал утверждение дела для востока. Есть ли способ поймать это во время компиляции.

Мне кажется (НЕТ), что именно поэтому язык предоставляет регистр по умолчанию, и, следовательно, это может быть невозможно. Но я оставлю это экспертам.

#include <iostream>
#include <string>

using namespace::std;

typedef enum
{
min_dir = -1,
north,
south,
east,
west,
}directions;

directions get_direction( string user_choice)
{
if(user_choice == "north")
{
return north;
}
else if (user_choice == "south")
{
return south;
}
else if (user_choice == "east")
{
return east;
}
else if (user_choice == "west")
{
return west;
}
else
{
return min_dir;
}
}

int main()
{
string user_direction;
cout << "Enter direction\n";
cin >> user_direction;

directions my_dir = get_direction(user_direction);
cout << " Print direction's description\n";

if( my_dir == min_dir)
{
// User passed junk
return -1;
}

switch(my_dir)
{
case north:
cout << "North - New york\n";break;
case south:
cout << "South - Alabama\n";break;
//  case east:
//      cout << "East - North Carolina\n";break;
case west:
cout << "West - California\n";break;
default:
cout << "Should Ideally never get here\n";break;
}
system("pause");
return 0;
}

Редактировать:
Это просто пример, чтобы проиллюстрировать это. Это для кода на работе. Они скомпилировали это как в Windows (MSVC), так и в Linux (GCC). Это было бы только предупреждением? Мне нужно более строгое исполнение.

Могу ли я написать некоторый код, который будет выдавать ошибку во время процесса make, если в enum нет оператора case?

3

Решение

В GCC (g ++) и Clang есть -Wswitch-enum, который предупредит вас, если у вас нет case для возможного значения для enum типа ты switch(даже если у вас есть default дело).

В MSVC есть сопоставимый C4062 который приходит с уровня предупреждения 3, но он не будет предупреждать вас, если у вас есть default заявление. Если вы хотите предупреждения в этом случае, вам нужно включить предупреждение уровня 4 C4061, который выдает предупреждение, если перечисляемое значение отсутствует, даже если задан регистр по умолчанию.

Что касается ошибки, то все компиляторы имеют опцию «обрабатывать предупреждения как ошибки». В GCC и Clang это -Werror; в MSVC это /WX,

5

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

Если вы используете массив функторов, размер которого указан в вашем перечислении и инициализирован при объявлении, то вы можете выполнить static_assert для размера массива в сравнении с количеством перечислений, чтобы убедиться, что все члены присутствуют. Используя функторы в массиве, а не указатели на функции, вы также уверены, что не указали в качестве значений nullptr, поскольку каждый функтор будет создан.

typedef enum
{
min_dir = -1,
north = 0,
south,
count_dir
}directions;

class GoDir
{
public:
virtual void operator()() {}
};

class GoNorth : public GoDir
{
public:
virtual void operator()() {}
};

class GoSouth : public GoDir
{
public:
virtual void operator()() {}
};

static GoDir actions[count_dir] = {GoNorth(), GoSouth()};
static_assert(sizeof(actions)/sizeof(actions[0]) == count_dir, "Error");
1

По вопросам рекламы [email protected]