std :: is_member_function_pointer一直返回true

时间:2014-05-15 07:59:27

标签: c++ templates

我正在寻找如何调用函数的答案,只有它存在并且在这个问题上发现了一些代码Is it possible to write a template to check for a function's existence?。我正在尝试使用std :: is_member_function_pointer作为调用专用模板化代码的鉴别器。但是我在输出中看到了两次,当我期望看到错误然后是真的。有关为什么会这样的任何建议?代码也可以在https://ideone.com/HZ17Wf

看到
#include <iostream>
#include <utility>
#include <type_traits>

namespace Ckb
{

struct Version
{
    enum { Major = 1, Minor = 0, Release = 0 };
    void CheckDependencies()
    {
        std::cout << "Ckb Check" << std::endl;
    }
};

}  // namespace Ckb

namespace Cg
{

struct Version { enum { Major = 1, Minor = 8, Release = 1 }; };

}  // namespace Cg

template <typename T, bool> struct RunCheck
{ void operator()() {std::cout << "false" << std::endl;} };

template <typename T> struct RunCheck<T, true>
{ void operator()() { std::cout << "true" << std::endl; } };

template <typename T> void Do()
{
    RunCheck<T, std::is_member_function_pointer<void(T::*)()>::value>()();
}

int main()
{
    Do<Cg::Version>();
    Do<Ckb::Version>();
    return 0;
}

1 个答案:

答案 0 :(得分:4)

void(T::*)() member_function_pointer (即使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::*)());

然后使用它:

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