Обычно вы можете определить приведение для класса, используя следующий синтаксис:
class Test {
public:
explicit operator bool() { return false; }
};
Есть ли способ сделать это или что-то подобное для enum class
?
Нет, это не так.
На самом деле, enum class
это не класс вообще. class
Ключевое слово используется только потому, что внезапно меняется незаданный enum
в прицеле enum
будет означать переделку все перечисляет коды. Поэтому комитет решил, что для проведения различий между перечислениями нового и старого стиля новые теги будут помечены class
потому что это ключевое слово уже нет enum
можно было бы назвать class
в C ++. Они могли бы выбрать другую, в любом случае это не имело бы большого смысла.
Однако, несмотря на class
Ключевое слово: они по-прежнему являются обычными перечислениями, поскольку в скобках разрешены только перечислители (и, возможно, значения, присвоенные им).
Нет, но вы можете заставить нормальный тип класса вести себя как класс enum, используя constexpr
члены и конструкторы. И тогда вы можете добавить все дополнительные функции-члены, которые вы хотите.
Вы не можете определить не-приведенные операторы приведения в 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
Я не скомпилировал его, поэтому будьте спокойны, если в нем есть ошибки :).