我希望我的宏只针对每个可能的参数展开一次。
#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 { };
当我使用相同的memberName
两次时,我不希望第二次展开宏,因为这会导致错误,因为函数现在定义了两次。我尝试在宏中使用宏,但我很清楚,这不会起作用,因为宏只展开一次(合理地)。虽然它可能澄清了这个问题:
#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
基于模板的解决方案也很好!
此宏是
中DEFINE_MEMBER_CHECKER
宏的略微修改版本
How to detect whether there is a specific member variable in class?