胡说八道

学而不思则罔,思而不学则殆

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
第一个是用TypeList产生一个分发器。

 // Dispatech
 // TL为TypeList
 // F<int >为实现函数的类
 template<typename TL,template <int> class F,typename FUNC>
 class Dispetcher
 {
 map<int,FUNC> m_function;

 template<typename H>
 void Build()
 {
 pair<int,FUNC> t_pair;
 t_pair.first=H::Head::value;
 t_pair.second=F<H::Head::value>::Update;

 m_function.insert(t_pair);

 Build<H::Tail>();
 };
 template<>
 void Build<NullType>(){};
 public:
 Dispetcher()
 {
 Build<TL>();
 };
 FUNC GetFunc(int id)
 {
 map<int,FUNC>::iterator t_iterator;

 t_iterator=m_function.find(id);

 if (t_iterator!=m_function.end())
 return t_iterator->second;

 return NULL;;
 };
 };

 若想添加相应的函数的话,只需要将map的key作为特例化实现F<key>::Update(这个Update和FUNC需要一样的类型),并且将这个key用Int2Type<key>加入到TypeList中即可。

 第二个实现TypeList中元素的相互操作:

 现在有一组状态集,每个状态可以相互转化。(设定状态的表示值是int,设定每两个状态值之间的差值是唯一的)
 比如说有状态
 A,B,C,状态值分别是(1,2,4)

 目的:
 得到一个TypeList,里面包含了状态之间的转化的所有情况(假设每两个状态都能互相转化).

 我的实现
 template<typename F,typename H=F,typename T=F>
 class DTypeList
 {
 public:
 typedef F List;
 typedef TypeList<Int2Type<H::Head::value-T::Head::value>,typename DTypeList<List,H,typename T::Tail>::Result> Result;
 };

 template<typename F,typename T>
 class DTypeList<F,T,NullType>
 {
 public:
 typedef F List;
 typedef typename DTypeList<F,typename T::Tail,F>::Result Result;
 };

 template<typename F,typename T>
 class DTypeList<F,NullType,T>
 {
 public:
 typedef F List;
 typedef NullType Result;
 };

 利用一个F来保存完整的TypeList,首先取出TypeList中的第一个,和TypeList里面的每一个进行操作,当后一个TypeList是NullType的时候,我们将第一个TypeList设置成下一个,第二个TypeList为我们保存的完整的TypeList, 一直到第一个TypeList的参数是NullType,我们就产生了一个新的TypeList饱含了所有状态之间的转换的可能。

posted on 2004-12-29 11:36  胡说八道  阅读(537)  评论(0)    收藏  举报