避免为同一输入多个宏展开

时间:2017-07-16 13:50:42

标签: c++ macros include-guards

我希望我的宏只针对每个可能的参数展开一次。

    #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?

0 个答案:

没有答案