#define ENUM_CLASS(name) using name = \
const class en_##name final{ \
private: \
using _en_name_ = en_##name; \
public:\
en_##name()=default;\
en_##name(const en_##name& c) = delete;\
en_##name & operator =(const en_##name&)= delete;
#define ENUM_TYPE(t) \
static _en_name_ const* t() { \
const static _en_name_ sample{};return &sample; \
}
#define ENUM_CLASS_END(name) }*; using name##_factory=std::remove_pointer<name>::type;
同一作用域下定义的枚举中的值的名字不能重复,如果分散到不同命名空间下又太难以统一维护,不如用类替换
ENUM_CLASS(align_type)
ENUM_TYPE(RIGHT)
ENUM_TYPE(LEFT)
ENUM_TYPE(CENTERING)
ENUM_TYPE(NONE)
ENUM_CLASS_END(align_type)
ENUM_CLASS(placing_type)
ENUM_TYPE(HERE)
ENUM_TYPE(TOP)
ENUM_TYPE(BOTTOM)
ENUM_TYPE(FORCE)
ENUM_CLASS_END(placing_type)
ENUM_CLASS(auto_size_type)
ENUM_TYPE(NONE)
ENUM_TYPE(PAGE)
ENUM_TYPE(TEXT)
ENUM_TYPE(COLUMN)
ENUM_TYPE(AUTO)
ENUM_CLASS_END(auto_size_type)