检查一个类是否具有给定签名的静态成员函数

时间:2015-05-21 11:51:32

标签: c++ templates c++11 sfinae

在这个问题中:

Check if a class has a member function of a given signature

它们解决了如何确定某个类是否具有某种类型的成员函数的问题。这可能听起来像一个天真的问题,但我无法自己找到。如何确定该签名是否存在静态函数?您是否可以扩展链接问题中给出的示例,以确定该类中是否存在返回used_memory或其他内容的静态函数?

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

#include <cstdint>

#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); \
    }

// signature is the important part for static. it is not (T::*)
DEFINE_HAS_SIGNATURE(has_static_foo, T::foo, void (*)(void));

// signature use (T::*) here for member
DEFINE_HAS_SIGNATURE(has_member_foo, T::foo, void (T::*)(void));

Live Example