Можно ли вручную определить преобразование для класса enum?

Обычно вы можете определить приведение для класса, используя следующий синтаксис:

class Test {
public:
explicit operator bool() { return false; }
};

Есть ли способ сделать это или что-то подобное для enum class?

36

Решение

Нет, это не так.

На самом деле, enum class это не класс вообще. class Ключевое слово используется только потому, что внезапно меняется незаданный enum в прицеле enum будет означать переделку все перечисляет коды. Поэтому комитет решил, что для проведения различий между перечислениями нового и старого стиля новые теги будут помечены classпотому что это ключевое слово уже нет enum можно было бы назвать class в C ++. Они могли бы выбрать другую, в любом случае это не имело бы большого смысла.

Однако, несмотря на class Ключевое слово: они по-прежнему являются обычными перечислениями, поскольку в скобках разрешены только перечислители (и, возможно, значения, присвоенные им).

18

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

Нет, но вы можете заставить нормальный тип класса вести себя как класс enum, используя constexpr члены и конструкторы. И тогда вы можете добавить все дополнительные функции-члены, которые вы хотите.

13

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

например

bool TestToBool(enum_e val)
{
return false;
}

const char *TestToString(enum_e val)
{
return "false";
}

Есть хороший способ связать эти перечисления с bools, вы должны разделить его на два файла .h и .cpp.
Вот если это поможет:

enum.h

///////////////////////////////
// enum.h
#ifdef CPP_FILE
#define ENUMBOOL_ENTRY(A, B)            { (enum_e) A, (bool) B },
struct EnumBool
{
enum_e  enumVal;
bool    boolVal;
};
#else
#define ENUMBOOL_ENTRY(A, B)            A,
#endif#ifdef CPP_FILE
static EnumBool enumBoolTable[] = {
#else
enum enum_e
{
#endif
ENUMBOOL_ENTRY(ItemA, true),
ENUMBOOL_ENTRY(ItemB, false),
...
};

bool EnumToBool(enum_e val);

enum.cpp

///////////////////////////////
// enum.cpp
#define CPP_FILE
#include "enum.h"
bool EnumToBool(enum_e val)
//implement

Я не скомпилировал его, поэтому будьте спокойны, если в нем есть ошибки :).

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