我正在寻找如何调用函数的答案,只有它存在并且在这个问题上发现了一些代码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;
}
答案 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>()();
}