diff --git a/src/util/io/get_member.hpp b/src/util/io/get_member.hpp index bba4ca8b..a7021fcd 100644 --- a/src/util/io/get_member.hpp +++ b/src/util/io/get_member.hpp @@ -143,7 +143,7 @@ private: #define REFLECT_ENUM_GET_MEMBER(Enum) \ template<> void GetDefaultMember::handle(const Enum& enum_) { \ EnumGetMember egm(*this); \ - reflect_ ## Enum(const_cast(enum_), egm); \ + ReflectEnum::reflect(const_cast(enum_), egm); \ } /// Handler to be used when reflecting enumerations for GetMember diff --git a/src/util/io/reader.hpp b/src/util/io/reader.hpp index eae1c4b3..c9f2df5d 100644 --- a/src/util/io/reader.hpp +++ b/src/util/io/reader.hpp @@ -263,12 +263,12 @@ void Reader::handle(IndexMap& m) { #define REFLECT_ENUM_READER(Enum) \ template<> void Reader::handle(Enum& enum_) { \ EnumReader reader(getValue()); \ - reflect_ ## Enum(enum_, reader); \ + ReflectEnum::reflect(enum_, reader); \ reader.warnIfNotDone(this); \ } \ void parse_enum(const String& value, Enum& out) { \ EnumReader reader(value); \ - reflect_ ## Enum(out, reader); \ + ReflectEnum::reflect(out, reader); \ reader.errorIfNotDone(); \ } diff --git a/src/util/io/writer.hpp b/src/util/io/writer.hpp index 97a2ccb2..771fa81e 100644 --- a/src/util/io/writer.hpp +++ b/src/util/io/writer.hpp @@ -142,7 +142,7 @@ void Writer::handle(const IndexMap& m) { #define REFLECT_ENUM_WRITER(Enum) \ template<> void Writer::handle(const Enum& enum_) { \ EnumWriter writer(*this); \ - reflect_ ## Enum(const_cast(enum_), writer); \ + ReflectEnum::reflect(const_cast(enum_), writer); \ } /// Handler to be used when reflecting enumerations for Writer diff --git a/src/util/reflect.hpp b/src/util/reflect.hpp index 8f7e96db..551eb3ba 100644 --- a/src/util/reflect.hpp +++ b/src/util/reflect.hpp @@ -159,6 +159,9 @@ // ----------------------------------------------------------------------------- : Reflecting enums +template +struct ReflectEnum {}; + /// Implement the refelection of a enumeration type Enum /** Usage: * @code @@ -176,13 +179,14 @@ * - GetDefaultMember::handle(const Enum&) */ #define IMPLEMENT_REFLECTION_ENUM(Enum) \ - template \ - void reflect_ ## Enum (Enum& enum_, Handler& handler); \ + template <> struct ReflectEnum { \ + template static void reflect(Enum&, Handler&); \ + }; \ REFLECT_ENUM_READER(Enum) \ REFLECT_ENUM_WRITER(Enum) \ REFLECT_ENUM_GET_MEMBER(Enum) \ template \ - void reflect_ ## Enum (Enum& enum_, Handler& handler) + void ReflectEnum::reflect(Enum& enum_, Handler& handler) /// Declare a possible value of an enum #define VALUE(val) handler.handle(_(#val), val, enum_)