如何检测具有特定签名的静态成员函数的存在? [英] How to detect the presence of a static member function with certain signature?

查看:37
本文介绍了如何检测具有特定签名的静态成员函数的存在?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现了几个问题,关于在处理时(通过SFINAE)检测给定类是否具有特定名称,类型或签名的成员的SO的答案。但是,我找不到一个同样适用于静态公共成员函数的函数(当指向成员的技巧不起作用时)。有任何想法吗?

I found several questions & answers on SO dealing with detecting at compile time (via SFINAE) whether a given class has a member of certain name, type, or signature. However, I couldn't find one that also applies to static public member functions (when pointer-to-member tricks won't work). Any ideas?

推荐答案

以下方法可能会有所帮助:( https ://ideone.com/nDlFUE

Following may help: (https://ideone.com/nDlFUE)

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

然后定义一个特征:

DEFINE_HAS_SIGNATURE(has_foo, T::foo, void (*)(void));

这篇关于如何检测具有特定签名的静态成员函数的存在?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆