星期二, 八月 21, 2007

metaprogramming:IF&RECURSION (cpp template)

首先把要处理的情况分为2类:要处理的是“类型”还是“数据”,
类似于template < typename T1,typename T2 >和template < int,float >。
最基本的,对于template < int,float >这一类的,
----------------------------------------------------------
递归:
template < int x, int y >
class Power
{
public:
enum { result = x * Power < x, y-1 >::result };
};

template < int x >
class Power < x,1 >
{
public:
enum { result = x };
};


int main()
{
cout < < Power < 2, 8 >::result < < endl;
}



-----------------------------------------------------------
分支:
template < bool,int SwitchResult >
class IF
{
public:
enum { result=SwitchResult};
};

template < int TrueSwitchResult >
class IF < true,TrueSwitchResult >
{
public:
enum { result=TrueSwitchResult};
};

template < int FalseSwitchResult >
class IF < false,FalseSwitchResult >
{
public:
enum { result=FalseSwitchResult*2};
};


int main()
{
cout < < IF < (3 > 5),10 >::result < < endl;
cout < < IF < (3 < 5),10 >::result < < endl;
}



在复杂一点的测试,和上面的那个递归模板类结合测试:

int main()
{
cout < < IF < (3 > 5),Power < 2, 10 >::result >::result < < endl;
cout < < IF < (3 < 5),Power < 2, 10 >::result >::result < < endl;
}


-------------------------------------------------------

稍微复杂的,对于template < typename T1,typename T2 >这一类:
也就是以“类型”为基本数据的,需要一些“基础设施”成立之后才能验证,
比如说TypeList,怎样枚举每一个Type,之后在按照上面的思想进行验证。
具体可参见Modern C++ Design

没有评论: