Clang3.6版本的Checker

一,Clang源码如下:

template<typenameCHECK1,typenameCHECK2=check::_VoidCheck,typenameCHECK3=check::_VoidCheck,typenameCHECK4=check::_VoidCheck,typenameCHECK5=check::_VoidCheck,typenameCHECK6=check::_VoidCheck,typenameCHECK7=check::_VoidCheck,typenameCHECK8=check::_VoidCheck,typenameCHECK9=check::_VoidCheck,typenameCHECK10=check::_VoidCheck,typenameCHECK11=check::_VoidCheck,typenameCHECK12=check::_VoidCheck,typenameCHECK13=check::_VoidCheck,typenameCHECK14=check::_VoidCheck,typenameCHECK15=check::_VoidCheck,typenameCHECK16=check::_VoidCheck,typenameCHECK17=check::_VoidCheck,typenameCHECK18=check::_VoidCheck,typenameCHECK19=check::_VoidCheck,typenameCHECK20=check::_VoidCheck,typenameCHECK21=check::_VoidCheck,typenameCHECK22=check::_VoidCheck,typenameCHECK23=check::_VoidCheck,typenameCHECK24=check::_VoidCheck>classChecker;template<>classChecker<check::_VoidCheck>:publicCheckerBase{virtualvoidanchor();public:staticvoid_register(void*checker,CheckerManager&mgr){}};template<typenameCHECK1,typenameCHECK2,typenameCHECK3,typenameCHECK4,typenameCHECK5,typenameCHECK6,typenameCHECK7,typenameCHECK8,typenameCHECK9,typenameCHECK10,typenameCHECK11,typenameCHECK12,typenameCHECK13,typenameCHECK14,typenameCHECK15,typenameCHECK16,typenameCHECK17,typenameCHECK18,typenameCHECK19,typenameCHECK20,typenameCHECK21,typenameCHECK22,typenameCHECK23,typenameCHECK24>classChecker:publicCHECK1,publicChecker<CHECK2,CHECK3,CHECK4,CHECK5,CHECK6,CHECK7,CHECK8,CHECK9,CHECK10,CHECK11,CHECK12,CHECK13,CHECK14,CHECK15,CHECK16,CHECK17,CHECK18,CHECK19,CHECK20,CHECK21,CHECK22,CHECK23,CHECK24>{public:template<typenameCHECKER>staticvoid_register(CHECKER*checker,CheckerManager&mgr){CHECK1::_register(checker,mgr);Checker<CHECK2,CHECK3,CHECK4,CHECK5,CHECK6,CHECK7,CHECK8,CHECK9,CHECK10,CHECK11,CHECK12,CHECK13,CHECK14,CHECK15,CHECK16,CHECK17,CHECK18,CHECK19,CHECK20,CHECK21,CHECK22,CHECK23,CHECK24>::_register(checker,mgr);}};

二,模拟实现Checker

头文件

/**********************************Author:szyu**Date:2016.12.27*********************************/#ifndef__SZYU_CLANG__#define__SZYU_CLANG__#include<iostream>classDefaultClass{public:staticvoid_register(){std::cout<<"InDefaultClass::_register()"<<std::endl;}};classFunctionClass1{public:staticvoid_register(){std::cout<<"InFunctionClass1::_register()"<<std::endl;}};classFunctionClass2{public:staticvoid_register(){std::cout<<"InFunctionClass2::_register()"<<std::endl;}};classFunctionClass3{public:staticvoid_register(){std::cout<<"InFunctionClass3::_register()"<<std::endl;}};template<typenameT1,typenameT2=DefaultClass,typenameT3=DefaultClass>classChecker;template<>classChecker<DefaultClass>{public:staticvoid_register(){std::cout<<"InChecker<DefaultClass>::_register()"<<std::endl;DefaultClass::_register();}};template<typenameT1,typenameT2,typenameT3>classChecker:publicT1,publicChecker<T2,T3>{public:staticvoid_register(){std::cout<<"InChecker<T1,T2,T3>::_register()"<<std::endl;T1::_register();Checker<T2,T3>::_register();}};#endif

测试用例

/**********************************Author:szyu**Date:2016.12.27*********************************/#include"register.h"voidtest1(){typedefChecker<DefaultClass>Checker1;Checker1::_register();std::cout<<"====================="<<std::endl;typedefChecker<FunctionClass1>Checker2;Checker2::_register();std::cout<<"====================="<<std::endl;typedefChecker<FunctionClass1,FunctionClass2>Checker3;Checker3::_register();std::cout<<"====================="<<std::endl;typedefChecker<FunctionClass1,FunctionClass2,FunctionClass3>Checker4;Checker4::_register();std::cout<<"====================="<<std::endl;}intmain(intargc,char*argv[]){test1();return0;}


执行结果