diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 74a6bf9a0..bf7472d99 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -483,7 +483,24 @@ class CppGenerator : public BaseGenerator { } code += "]; }\n\n"; } - + + // Generate type traits for unions to map from a type to union enum value. + if (enum_def.is_union) { + for (auto it = enum_def.vals.vec.begin(); + it != enum_def.vals.vec.end(); + ++it) { + auto &ev = **it; + if (it == enum_def.vals.vec.begin()) { + code += "template struct " + enum_def.name + "Traits {\n"; + } + else { + code += "template<> struct " + enum_def.name + "Traits<" + WrapInNameSpace(*ev.struct_def) + "> {\n"; + } + code += " static const " + enum_def.name + " enum_value = " + GenEnumValDecl(enum_def, ev.name, parser_.opts) + ";\n"; + code += "};\n\n"; + } + } + if (enum_def.is_union) { code += UnionVerifySignature(enum_def) + ";\n\n"; } diff --git a/tests/monster_test.bfbs b/tests/monster_test.bfbs index 0369f8969..66d3ee8f2 100644 Binary files a/tests/monster_test.bfbs and b/tests/monster_test.bfbs differ diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index bb37b9536..e55b9d96e 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -76,6 +76,22 @@ inline const char **EnumNamesAny() { inline const char *EnumNameAny(Any e) { return EnumNamesAny()[static_cast(e)]; } +template struct AnyTraits { + static const Any enum_value = Any_NONE; +}; + +template<> struct AnyTraits { + static const Any enum_value = Any_Monster; +}; + +template<> struct AnyTraits { + static const Any enum_value = Any_TestSimpleTableWithEnum; +}; + +template<> struct AnyTraits { + static const Any enum_value = Any_MyGame_Example2_Monster; +}; + inline bool VerifyAny(flatbuffers::Verifier &verifier, const void *union_obj, Any type); MANUALLY_ALIGNED_STRUCT(2) Test FLATBUFFERS_FINAL_CLASS {