// 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饱含了所有状态之间的转换的可能。

浙公网安备 33010602011771号