如何检查成员函数是否具有const重载?

Xar*_*arn 4 c++ templates c++11

可以说我有

struct foo {
    void ham() {}
    void ham() const {}
};

struct bar {
    void ham() {}
};
Run Code Online (Sandbox Code Playgroud)

假设我有一个模板化函数,我可以判断给定类型是否具有const重载ham

Jar*_*d42 6

#define DEFINE_HAS_SIGNATURE(traitsName, funcName, signature)               \
    template <typename U>                                                   \
    class traitsName                                                        \
    {                                                                       \
    private:                                                                \
        template<typename T, T> struct helper;                              \
        template<typename T>                                                \
        static std::uint8_t check(helper<signature, &funcName>*);           \
        template<typename T> static std::uint16_t check(...);               \
    public:                                                                 \
        static                                                              \
        constexpr bool value = sizeof(check<U>(0)) == sizeof(std::uint8_t); \
    }

DEFINE_HAS_SIGNATURE(has_ham_const, T::ham, void (T::*)() const);
Run Code Online (Sandbox Code Playgroud)

然后

static_assert(has_ham_const<foo>::value, "unexpected");
static_assert(!has_ham_const<bar>::value, "unexpected");
Run Code Online (Sandbox Code Playgroud)

演示