[C++模板]Clang3.9使用变参模拟实现CheckerFn和Checker
Clang3.9使用变参模拟实现CheckerFn和Checker
一,使用变参实现CheckerFn
1,头文件
/***********************************Author:szyu**Date:2017.1.4************************************/#ifndef__SZYU_CLANG__#define__SZYU_CLANG__#include<iostream>/**********************************clang3.9使用变参实现CheckerFn**********************************/template<typenameT>classCheckerFn;template<typenameT,typename...Args>classCheckerFn<T(Args...)>{private:typedefT(*Func)(Args...);FuncFn;public:CheckerFn(){std::cout<<"InCheckerFn::CheckerFn()"<<std::endl;}CheckerFn(Funcf):Fn(f){std::cout<<"InCheckerFn::CheckerFn(Funcf)"<<std::endl;}Toperator()(Args...args)const{Fn(args...);}};#endif
2,测试用例
/**********************************Author:szyu**Date:2017.1.4************************************/#include"param.h"voidfunc11(){std::cout<<"Infunc11"<<std::endl;}voidfunc12(intv){std::cout<<"Infunc12"<<std::endl;std::cout<<"Args..."<<v<<std::endl;}voidfunc13(intv,charch){std::cout<<"Infunc13"<<std::endl;std::cout<<"Args1..."<<v<<",Args2..."<<ch<<std::endl;}voidtest1(){typedefCheckerFn<void()>CheckOne;CheckOneone(func11);one();std::cout<<"**********************************"<<std::endl;typedefCheckerFn<void(int)>CheckTwo;CheckTwotwo(func12);intvalue=7;two(value);std::cout<<"**********************************"<<std::endl;typedefCheckerFn<void(int,char)>CheckThree;CheckThreethree(func13);value=9;charch='B';three(value,ch);}intmain(intargc,char*argv[]){test1();return0;}
3,执行结果
二,使用变参实现Checker
1,头文件
/***********************************Author:szyu**Date:2017.1.4************************************/#ifndef__SZYU_CLANG__#define__SZYU_CLANG__#include<iostream>/**********************************clang3.9使用变參实现Checker**********************************/classRegister1{public:staticvoid_register(){std::cout<<"InRegister1::_register()"<<std::endl;}};classRegister2{public:staticvoid_register(){std::cout<<"InRegister2::_register()"<<std::endl;}};classRegister3{public:staticvoid_register(){std::cout<<"InRegister3::_register()"<<std::endl;}};template<typenameT1,typename...Args>classChecker:publicT1,publicArgs...{public:staticvoid_register(){std::cout<<"InChecker<T1,Args...>::_register()"<<std::endl;T1::_register();Checker<Args...>::_register();}};template<typenameT1>classChecker<T1>{public:staticvoid_register(){std::cout<<"InChecker<T1>::_register()"<<std::endl;T1::_register();}};#endif
2,测试用例
/***********************************Author:szyu**Date:2017.1.4************************************/#include"param2.h"voidtest1(){Checker<Register1>::_register();std::cout<<"**********************************"<<std::endl;Checker<Register1,Register2>::_register();std::cout<<"**********************************"<<std::endl;Checker<Register1,Register2,Register3>::_register();}intmain(intargc,char*argv[]){test1();return0;}
3,执行结果
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。