博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++使用宏检测类是否包含某个函数或者变量属性
阅读量:4208 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
ACM经历总结[转载]
查看>>
C/C++文件操作[转载]
查看>>
专业计划
查看>>
小米笔试:最大子数组乘积
查看>>
常见的排序算法
查看>>
5.PyTorch实现逻辑回归(二分类)
查看>>
6.PyTorch实现逻辑回归(多分类)
查看>>
8.Pytorch实现5层全连接结构的MNIST(手写数字识别)
查看>>
9.PyTorch实现MNIST(手写数字识别)(2卷积1全连接)
查看>>
hdu 3460 Ancient Printer(trie tree)
查看>>
中间数
查看>>
KMP求前缀函数(next数组)
查看>>
KMP
查看>>
poj 3863Business Center
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>
DRM in Android
查看>>
ARC MRC 变换
查看>>
Swift cell的自适应高度
查看>>