templatemain.cppstruct __ext_enum { public: typedef T type_value; typedef int type_index; static T value(int index) { auto baseAddr = (const char*)(EnumExt_T::get()); return T (*(const T*)(baseAddr + sizeof(T) *index)); } static type_index index(const T &elem) { for (int i = 0; i < EnumExt_T::count(); i++) { if (value(i) == elem) return i; } return -1; } static int len() { return sizeof(EnumExt_T); } static int count() { return len() == 0 ? 0 : len() / sizeof(type_value); } static auto get(){ static EnumExt_T instance; return &instance; } static QList toQList() { QList result; for (int i = 0; i < EnumExt_T::count(); i++) { result << EnumExt_T::value(i); } return result; } static bool contains(const type_value &value) { for (int i = 0; i < EnumExt_T::count(); i++) { if (value == EnumExt_T::value(i)) return true; } return false; } static QJsonArray toArray(){ QJsonArray result; for (int i = 0; i < EnumExt_T::count(); i++) { result << EnumExt_T::value(i); } return result; } }; #define enum_exp public: const type_value #define enum_def(name, type) class name : public __ext_enum #define enum_type(name) name::type_value
#includeenum_def(FailureHandlingKind, std::string) { enum_exp Abort = "abort"; enum_exp Transactional = "transactional"; enum_exp Undo = "undo"; enum_exp TextOnlyTransactional = "textOnlyTransactional"; }; int main(int argc, char *argv[]) { std::cout << FailureHandlingKind::get()->value(0) << std::endl; std::cout << FailureHandlingKind::get()->index("undo") << std::endl; }
如果不想使用转换函数 QList QJsonArray,可将相关函数屏蔽



