C++ std::成员函数指针是否始终返回true

C++ std::成员函数指针是否始终返回true,c++,templates,C++,Templates,我正在寻找如何仅在函数存在时调用函数的答案,并在这个问题上找到了一些代码。我试图使用std::is_member_function_指针作为鉴别器来调用专门的模板代码。但我在输出中看到了两次真,我希望看到假,然后是真。有没有关于为什么会这样的建议?代码也可以在 #包括 #包括 #包括 名称空间Ckb { 结构版本 { 枚举{Major=1,Minor=0,Release=0}; void CheckDependencies() { std::coutvoid(T::*)()是成员函数指针(即使T

我正在寻找如何仅在函数存在时调用函数的答案,并在这个问题上找到了一些代码。我试图使用std::is_member_function_指针作为鉴别器来调用专门的模板代码。但我在输出中看到了两次真,我希望看到假,然后是真。有没有关于为什么会这样的建议?代码也可以在

#包括
#包括
#包括
名称空间Ckb
{
结构版本
{
枚举{Major=1,Minor=0,Release=0};
void CheckDependencies()
{
std::cout
void(T::*)()
是成员函数指针(即使
T
没有任何匹配方法)

我想你应该使用类似于:

#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_CheckDependencies, T::CheckDependencies, void (T::*)());
#包括
#定义\u具有\u签名(traitsName、funcName、签名)\
模板\
类traitsName\
{                                                                       \
私人:\
模板结构助手\
模板\
静态标准::uint8_t检查(helper*)\
模板静态标准::uint16_t检查(…)\
公众:\
静止的\
constexpr bool value=sizeof(检查(0))==sizeof(标准::uint8_t)\
}
定义_HAS_签名(HAS_CheckDependencies,T::CheckDependencies,void(T::*)());
然后使用它:

template <typename T> void Do()
{
    RunCheck<T, has_CheckDependencies<T>::value>()();
}
模板void Do()
{
RunCheck();
}
void(T::*)()
是成员函数指针(即使
T
没有任何匹配方法)

我想你应该使用类似于:

#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_CheckDependencies, T::CheckDependencies, void (T::*)());
#包括
#定义\u具有\u签名(traitsName、funcName、签名)\
模板\
类traitsName\
{                                                                       \
私人:\
模板结构助手\
模板\
静态标准::uint8_t检查(helper*)\
模板静态标准::uint16_t检查(…)\
公众:\
静止的\
constexpr bool value=sizeof(检查(0))==sizeof(标准::uint8_t)\
}
定义_HAS_签名(HAS_CheckDependencies,T::CheckDependencies,void(T::*)());
然后使用它:

template <typename T> void Do()
{
    RunCheck<T, has_CheckDependencies<T>::value>()();
}
模板void Do()
{
RunCheck();
}

是否检查
CheckDependencies()
是否存在(签名正确)?是否检查
CheckDependencies()
是否存在(签名正确)?非常感谢您的帮助,@Jarod42。这在c++11编译器上运行得很好。我尝试过其他编译器,将类型改为short和int似乎也能工作。遗憾的是,我使用的目标编译器来自旧Borland系列(现在是Embarcadero),版本4没有编译。我认为它在DEFINE\u has\u签名行上有问题(has_CheckDependencies,T::CheckDependencies,void(T::*)())因为出于某种奇怪的原因,它需要知道T是什么。心理…无论如何,再次感谢你的帮助。非常感谢你的帮助,@Jarod42。这与c++11编译器配合得很好。我尝试过其他编译器,并将类型改为缩写,int似乎也可以。遗憾的是,我使用的目标编译器来自旧Borland家族(现在Embarcadero)和版本4没有编译。我认为它的DEFINE_has_签名(has_CheckDependencies,T::CheckDependencies,void(T::*)())行有问题,因为出于某种奇怪的原因,它需要知道T是什么。心理…无论如何,再次感谢您的帮助。