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?