本文共 2157 字,大约阅读时间需要 7 分钟。
对于特定的函数或者变量属性检测一个特定的参数类:
#include#include #include using namespace boost;using namespace std;#define _CAT(A, B) A##B#define STR(s) #s#define CAT(A,B) _CAT(A,B)#define CHECKER_PREFIX __has_member_function_#define HAS_MEMBER_FUNC_CHECKER_NAME(FUNC) CAT(CHECKER_PREFIX, FUNC)#define HAS_MEMBER_FUNC_CHECKER(FUNC) template \ struct HAS_MEMBER_FUNC_CHECKER_NAME(FUNC){ \ template static std::true_type test(decltype(&C::FUNC)); \ template static std::false_type test(...); \ static constexpr bool value = std::is_same (nullptr)),std::true_type>::value; \};#define HAS_MEMBER_FUNC(TYPE, FUNC) (HAS_MEMBER_FUNC_CHECKER_NAME(FUNC) ::value)class TestA{public: int* foo(){ int* a =new int(1); return a; } static int foo2(){ return 1; } static const int foo3;};HAS_MEMBER_FUNC_CHECKER(foo);HAS_MEMBER_FUNC_CHECKER(foo2);HAS_MEMBER_FUNC_CHECKER(foo3);int main() { static_assert(HAS_MEMBER_FUNC(TestA, foo)); std::cout<
对于确定参数类型的泛型成员函数:
#include#include #include using namespace boost;using namespace std;#define _CAT(A, B) A##B#define STR(s) #s#define CAT(A,B) _CAT(A,B)// 对于固定个数的模版类,检测某一个属性或者函数是否存在#define CHECKER_PREFIX2 _has_member_fcuntoin2_#define HAS_MEMBER_FUNC_CHECK_NAME2_(FUNC) CAT(CHECKER_PREFIX2,FUNC)#define HAS_MEMBER_FUNC_CEHCKER2(FUNC) template \ struct HAS_MEMBER_FUNC_CHECK_NAME2_(FUNC){ \ template static std::true_type test(decltype(&C::template FUNC )); \ template static std::false_type test(...); \ static constexpr bool value = std::is_same (nullptr)),std::true_type>::value; \}// #define IF_HAS_MEMBER_FUNC2(FUNC,CLASS_,CLASS_F_T) (HAS_MEMBER_FUNC_CEHCK_NAME2_(FUNC) ::value)class TestA{public: int* foo(){ int* a =new int(1); return a; } static int foo2(){ return 1; } template static int foo4(){ return 1; } static const int foo3;};//含有固定类型的模版类HAS_MEMBER_FUNC_CEHCKER2(foo4);int main() { std::cout<< HAS_MEMBER_FUNC_CHECK_NAME2_(foo4) ::value << std::endl; //输出 1 std::cout<< HAS_MEMBER_FUNC_CHECK_NAME2_(foo4) ::value << std::endl; // 输出1 return 0;}
参考:
转载地址:http://idwmi.baihongyu.com/