检查某个特定名称的成员函数实现比较容易。
但是没有想好怎么实现对任意名字的成员函数进行检测。这里本人的对任意成员函数检测的实现略笨拙。
has_member_function.h
namespace has_member_function_details {
#define build_member_validator(F) struct HasMemberValidator##F { \
template<typename T, typename=decltype(&T::F)> \
static std::true_type __test(int); \
\
template<typename> \
static std::false_type __test(...); \
}; \
}; \
\
template<typename T, int X=decltype(has_member_function_details::HasMemberValidator##F::__test<T>(0))::value> \
struct has_member_function_##F { \
static const int value; \
}; \
template<typename T> \
struct has_member_function_##F<T, 1> { \
static const int value = 1; \
};\
\
template<typename T> \
struct has_member_function_##F<T, 0> { \
static const int value = 0; \
};\
test.cpp
#include <iostream>
#include "../has_member_function.h"
build_member_validator(ToString);
struct testClazz1 {
std::string toString();
};
struct testClazz2 {
std::string ToString();
};
int main() {
std::cout << "testClazz1: " << has_member_function_ToString<testClazz1>::value << std::endl;
std::cout << "testClazz2: " << has_member_function_ToString<testClazz2>::value << std::endl;
}
输出
testClazz1: 0
testClazz2: 1
Process finished with exit code 0