3

I want my macro to be only unfolded once for each possible argument.

    #define PAX_CREATE_MEMBER_CHECKER_FOR_NAME(memberName) \
            template <typename T, typename = int> \
            struct HasMember_##memberName : std::false_type { }; \
            template <typename T> \
            struct HasMember_##memberName <T, decltype((void) T::memberName, 0)> : std::true_type { };

When I use the same memberName twice, I don't want the macro to be unfolded a second time, cause this would lead to errors, as the functions are now defined twice. I tried to use macros inside macros, but it is clear to me, that this won't work, as macros are unfolded only once (reasonably). Although it might clarify the question:

    #define PAX_CREATE_MEMBER_CHECKER_FOR_NAME(memberName) \
        #ifndef PAX_CREATE_MEMBER_CHECKER_FOR_NAME_##memberName \
        #define PAX_CREATE_MEMBER_CHECKER_FOR_NAME_##memberName \
            template <typename T, typename = int> \
            struct HasMember_##memberName : std::false_type { }; \
            template <typename T> \
            struct HasMember_##memberName <T, decltype((void) T::memberName, 0)> : std::true_type { }; \
        #endif

A template-based solution is fine, too!


This macro is a slightly modified version of DEFINE_MEMBER_CHECKER macro in

How to detect whether there is a specific member variable in class?

0 Answers0