с ++ 11 и перечисления различий

//c++03
enum Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[SCOUNT];

//c++11
enum class Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[(int) Something::SCOUNT];

Как я могу использовать перечисления в этом случае без приведения числа перечислений к int?

3

Решение

Как я могу использовать перечисления в этом случае без приведения числа перечислений к int? *

Вы не можете … Но вы можете удалить class от enum class

class Ключевое слово означает, что вы не можете неявно конвертировать между этим enum а также int Удаление class ключевое слово означает ваш enum будет работать так же, как и в предыдущих версиях C ++. Вам не понадобится актерский состав, но вы потеряете безопасность strongly typed enums разрешая неявное приведение к целочисленным значениям.

//C++11
enum class Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[SCOUNT]; // ERRROR

//C++11
enum Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[SCOUNT]; // OK

Вы можете прочитать больше о strongly typed enums Вот


Другой вариант — разыграть его, как вы делаете. Но вы должны избегать старого C-style cast и использовать static_cast<> вместо этого, поскольку это имеет лучшую безопасность типов и является более явным.

//C++11
enum class Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[static_cast< size_t > ( SCOUNT ) ]; // OK
10

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

На самом деле во втором случае вы не можете написать это без приведения.

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

int arr[to_integral(Something::SCOUNT)];

где to_integral определяется как:

#include <type_traits> //it is where std::underlying_type is defined

template<typename E>
constexpr auto to_integral(E e) -> typename std::underlying_type<E>::type
{
return static_cast<typename std::underlying_type<E>::type>(e);
}

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

5

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