最近调试的一段代码,请一起look look!
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; namespace MCD { template<class T,class U> struct Typelist{ typedef T Head; typedef U Tail; }; class NullType; #define TYPELIST_1(T1) Typelist<T1,NullType> #define TYPELIST_2(T1,T2) Typelist<T1,TYPELIST_1(T2)> #define TYPELIST_3(T1,T2,T3) Typelist<T1,TYPELIST_2(T2,T3)> #define TYPELIST_4(T1,T2,T3,T4) Typelist<T1,TYPELIST_3(T2,T3,T4)> template<class Tlist> struct Length; template<> struct Length<NullType> { enum{value = 0}; }; template<class T,class U> struct Length<Typelist<T,U> > { enum{value = 1 + Length<U>::value}; }; template<class Tlist,unsigned int index> struct TypeAt; template<class Head,class Tail> struct TypeAt<Typelist<Head,Tail>,0> { typedef Head Result; }; template<class Head,class Tail,unsigned int i> struct TypeAt<Typelist<Head,Tail>,i> { typedef typename TypeAt<Tail,i-1>::Result Result; }; } // End of MCD namespace SolidMCP { class FontTable { public: virtual void Read(){ std::cout << "Reading Font Table" << std::endl; } }; class CMAP_Table:public FontTable { public: CMAP_Table() { std::cout << "Initializing CMAP Table" << std::endl; } void Read() { std::cout << "Read CMAP Table" << std::endl; } static char* GetName() { return "CMAP_Table"; } }; class OS2_Table:public FontTable { public: OS2_Table() { std::cout << "Initializing OS2 Table" << std::endl; } void Read() { std::cout << "Read OS2 Table" << std::endl; } static char* GetName() { return "OS2_Table"; } }; class HEAD_Table:public FontTable { public: HEAD_Table(){ std::cout<< "Initializing HEAD Table" << std::endl; } void Read(){ std::cout << "Read HEAD Table" << std::endl; } static char* GetName(){ return "HEAD_Table"; } }; class HHEA_Table:public FontTable { public: HHEA_Table(){ std::cout << "Initializing HHEA Table" << std::endl; } void Read() { std::cout << "Read HHEA Table" << std::endl; } static char* GetName() { return "HHEA_Table"; } }; class Unknown_Table:public FontTable { public: Unknown_Table(){ std::cout << "Initializing Unknown Table" << std::endl; } void Read() { std::cout << "Read Unknown Table" << std::endl; } static char* GetName() { return "Unknown_Table"; } }; template<class Tlist> struct ReadTable; template<class T> struct ReadTable<MCD::Typelist<T,MCD::NullType> > { static bool Execute() { T table; table.Read(); return true; } }; template<class T,class U> struct ReadTable<MCD::Typelist<T,U> > { static bool Execute() { if(ReadTable<MCD::Typelist<typename U::Head,typename U::Tail> >::Execute()) { T table; table.Read(); } return true; } }; // ReadTaleLoop template<class T,int i> struct ReadTableLoop { static void Execute() { // g递归ui用的很好 ReadTableLoop<T,i-1>::Execute(); typename MCD::TypeAt<T,i-1>::Result table; table.Read(); } }; template<class T> struct ReadTableLoop<T,0> { static void Execute(){} }; // create table class Name template<class Tlist> struct CreateObject; template<class T,class U> struct CreateObject<MCD::Typelist<T,U> > { static void* Execute(char* pName) { if(strcmp(T::GetName(),pName) == 0) { return new T; }else{ return CreateObject<U>::Execute(pName); } } }; template<> struct CreateObject<MCD::NullType> { static void* Execute(char* pName) { return NULL; } }; }// END OF SoildMCP // How to use using namespace SolidMCP; using namespace MCD; int main() { typedef TYPELIST_4(CMAP_Table,OS2_Table,HEAD_Table,HHEA_Table) FontTableList; std::cout << "--Length is " << Length<FontTableList>::value << std::endl; std::cout << "Read the 2nd Table" << std::endl; TypeAt<FontTableList,2>::Result table; table.Read(); std::cout<<"Begin ReadTable" << std::endl; ReadTable<FontTableList>::Execute(); std::cout << "Begin ReadTableLoop" << std::endl; ReadTableLoop<FontTableList,Length<FontTableList>::value>::Execute(); std::cout << "Begin Create Object By Name" << std::endl; FontTable* pTable = (FontTable *)CreateObject<FontTableList>::Execute("HEAD_Table"); pTable->Read(); return 0; }