Hot to use typelist of Loki??

简介: 最近调试的一段代码,请一起look look!#include #include #include using namespace std; namespace MCD { template struct Typelist{...
最近调试的一段代码,请一起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;
}
目录
相关文章
|
9月前
|
存储 自然语言处理 JavaScript
Storage存储-正则表达式(coderwhy版本)(一)
Storage存储-正则表达式(coderwhy版本)
71 0
|
9月前
|
存储 JavaScript Java
Storage存储-正则表达式(coderwhy版本)(二)
Storage存储-正则表达式(coderwhy版本)
100 0
|
7月前
|
存储 传感器 SQL
influxdb 中得 fields 与 tag 区别总结
influxdb 中得 fields 与 tag 区别总结
678 1
|
9月前
|
JSON 数据格式
FileBeat替换@timestamp的四种方法
FileBeat替换@timestamp的四种方法
833 0
|
搜索推荐 索引
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
|
索引
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(3)
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(3)
110 0
|
算法 索引
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(1)
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(1)
134 0
|
存储 JSON 数据格式
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(4)
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(4)
133 0
|
存储 API 索引
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(5)
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(5)
137 0
|
存储 缓存 算法
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(2)
带你读《Elastic Stack 实战手册》之16:——3.4.2.1.inverted index,doc_values,store及source(2)
136 0