| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > Linux开发区 > 软件开发

C++自动化(模板元)编程基础与应用

时间:2006-06-16 11:29:29  来源:中国IT实验室  作者:Linux联盟收集
g :[long ]vDTLinux联盟
float :[float ]vDTLinux联盟
double:[double]vDTLinux联盟
std::string:[std::string]vDTLinux联盟
std::complex:[std::complex]vDTLinux联盟
std::complex:[std::complex]vDTLinux联盟
**************************************************************/vDTLinux联盟
////////////////////////////////////////////////////////////vDTLinux联盟
#if 0vDTLinux联盟
vDTLinux联盟
从CODE1的运行结果可以看出:已经成功的分辨出了各个不同的类型。但是我们还是可vDTLinux联盟
以看出为了能够分辨出不同的类型需要编写大量的代码,对于基础类型这是不可避免的,vDTLinux联盟
但是值得庆幸的是C++里面的基本类型是有限的,所以作为一个库的编写者来说完全可采用vDTLinux联盟
穷举的方法来完成的。但是我们可以看出针对于CODE1中的std::complex和std::vDTLinux联盟
complex来说,它们实际上是一种模板代码,不同的模板参数完全可产生出无数的vDTLinux联盟
类型出来,对于这样的模板类型来说,采用穷举的方法恐怕就不行了。当然这里的复数类vDTLinux联盟
一般就只会使用float和double来作为模板参数,但是对于判断某个型别是否是某个模板类vDTLinux联盟
型以及判断某个类型是否是某个模板类型的派生类就力不足心了。为了便于讨论这个问题vDTLinux联盟
,我们假定这个模板类型只有一个模板参数。参见下面的代码:vDTLinux联盟
vDTLinux联盟
#endifvDTLinux联盟
#ifdef CODE_NOTEvDTLinux联盟
//某个模板类vDTLinux联盟
template struct Template{};vDTLinux联盟
//某个模板类的派生类vDTLinux联盟
template struct Derived:public Template{};vDTLinux联盟
#endif//CODE_NOTEvDTLinux联盟
#if 0vDTLinux联盟
vDTLinux联盟
对于上面的Template模板类来说同样可以采用CODE1中的方案来实现类型识别的,参看vDTLinux联盟
CODE2中的测试代码:vDTLinux联盟
vDTLinux联盟
#endifvDTLinux联盟
#ifdef CODE2//g++ -DCODE2 thisfile.cppvDTLinux联盟
#include vDTLinux联盟
#include vDTLinux联盟
#include vDTLinux联盟
//某个模板类vDTLinux联盟
templatestruct Template{};vDTLinux联盟
//识别这个模板类的方法:vDTLinux联盟
template struct traits{static const char*name(){return "Is not kind of Template";}};vDTLinux联盟
template struct traits >{static const char*name(){return "Is kind of Template";}};vDTLinux联盟
template struct traits
<:complex >{static const char*name(){return "Is kind of std::complex";}};vDTLinux联盟
int main()vDTLinux联盟
{vDTLinux联盟
std::cout << "char :[" << traits >::name() << "]" << std::endl;vDTLinux联盟
std::cout << "int :[" << traits >::name() << "]" << std::endl;vDTLinux联盟
std::cout << "short :[" << traits >::name() << "]" << std::endl;vDTLinux联盟
std::cout << "long :[" << traits >::name() << "]" << std::endl;vDTLinux联盟
std::cout << "float :[" << traits >::name() << "]" << std::endl;vDTLinux联盟
std::cout << "double:[" << traits >::name() << "]" << std::endl;vDTLinux联盟
std::cout << "std::string:[" << traits
<:string> >::name() << "]" << std::endl;vDTLinux联盟
std::cout << "std::complex :[" << traits
<:complex >::name() << "]" << std::endl;vDTLinux联盟
std::cout << "std::complex:[" << traits
<:complex >::name() << "]" << std::endl;vDTLinux联盟
return 0;
vDTLinux联盟
}vDTLinux联盟
#endif//CODE2vDTLinux联盟
////////////////////////////////////////////////////vDTLinux联盟
//该程序的运行结果:vDTLinux联盟
/***************************************************vDTLinux联盟
char :[Is kind of Template]vDTLinux联盟
int :[Is kind of Template]vDTLinux联盟
short :[Is kind of Template]vDTLinux联盟
long :[Is kind of Template]vDTLinux联盟
float :[Is kind of Template]vDTLinux联盟
double:[Is kind of Template]vDTLinux联盟
std::string:[Is kind of Template]vDTLinux联盟
std::complex :[Is kind of std::complex]vDTLinux联盟
std::complex:[Is kind of std::complex]vDTLinux联盟
*****************************************************/vDTLinux联盟
/////////////////////////////////////////////////vDTLinux联盟
#if 0vDTLinux联盟
vDTLinux联盟
从CODE2的运行结果可以看出:我们已经成功的识别出了同一个模板类实例化出来的所vDTLinux联盟
有的类型。现在我们就来考虑一下如何识别出某个模板类的派生类的问题,也就前面提到vDTLinux联盟
的Derived类型的识别问题。对于这种问题就不可能用前面第一种方法来识别了。这个时候vDTLinux联盟
就是第二种识别方法隆重登场的时候了。参见CODE3的代码:vDTLinux联盟
vDTLinux联盟
#endifvDTLinux联盟
#ifdef CODE3//g++ -DCODE3 thisfile.cppvDTLinux联盟
#include vDTLinux联盟
#include vDTLinux联盟
#include vDTLinux联盟
//某个模板类vDTLinux联盟
template struct Template{};vDTLinux联盟
//另一个模板类vDTLinux联盟
template struct AnotherTemplate{};vDTLinux联盟
//某个模板类的派生类,可以有无数种vDTLinux联盟
struct Derived1:public Template{};vDTLinux联盟
struct Derived2:public Template{};vDTLinux联盟
struct Derived3:public Template{};vDTLinux联盟
struct Derived4:public Template{};vDTLinux联盟
struct Derived5:public Template{};vDTLinux联盟
struct Derived6:public Template{};vDTLinux联盟
struct Derived7:public Template<:string>{};vDTLinux联盟
struct Derived8:public Template<:complex >{};vDTLinux联盟
struct Derived9:public Template<:complex >{};vDTLinux联盟
//考虑到这种情况必须采用一种映射关系,将所有的Template模板类的派生类都映射成为vDTLinux联盟
//Template类型,注意哦,这里是映射而不是转型哦!映射到了Template类型之后再采用vDTLinux联盟
//比较这个类型和参数类型的尺寸的方法来实现识别功能,具体代码如下:vDTLinux联盟
template class TemplateType>vDTLinux联盟
class is_kind_ofvDTLinux联盟
{vDTLinux联盟
//定义一个类型来表示任意类型vDTLinux联盟
typedef char AnyType;vDTLinux联盟
//定义一个类型来表示指定的类型vDTLinux联盟
class SpecifiedType {char unnamed[2];};vDTLinux联盟
//完成任意类型映射成为AnyType的功能vDTLinux联盟
static AnyType Map(...);vDTLinux联盟
//完成指定模板类型映射成为SpecifiedType的功能vDTLinux联盟
//这里还使用了函数传递参数的时候隐式转型的能力vDTLinux联盟
templatevDTLinux联盟
static SpecifiedType Map(TemplateType);vDTLinux联盟
public:vDTLinux联盟
//通过计算映射之后的两个类型的尺寸来识别类型vDTLinux联盟
enum{vDTLinux联盟
//传递参数的时候让编译器来自动选择合适的Map函数以完成类型映射功vDTLinux联盟
//能vDTLinux联盟
yes=(sizeof(Map(T()))==sizeof(SpecifiedType)),vDTLinux联盟
no =(sizeof(Map(T()))==sizeof(AnyType))vDTLinux联盟
};vDTLinux联盟
};vDTLinux联盟
//下面是测试代码vDTLinux联盟
int main()vDTLinux联盟
{std::cout << "Derived1 is kind of Template? " << is_kind_of::yes << std::endl;
<:string><:complex<:complex<:endl;
<:endl;
<:endl;
<:endl;
<:endl;
<:endl;
<:string><:endl;
<:complex<:endl;
<:complex<:endl;
<:complex<:string><:complex<:complex<:string><:complex<:complexstd::cout << "Derived2 is kind of Template? " << is_kind_of::yes << std::endl;vDTLinux联盟
std::cout << "Derived3 is kind of Template? " << is_kind_of::yes << std::endl;vDTLinux联盟
std::cout << "Derived4 is kind of Template? " << is_kind_of::yes << std::endl;vDTLinux联盟
std::cout << "Derived5 is kind of Template? " << is_kind_of::yes << std::endl;vDTLinux联盟
std::cout << "Derived6 is kind of Template? " << is_kind_of::yes << std::endl;vDTLinux联盟
std::cout << "Derived7 is kind of Template? " << is_kind_of::yes << std::endl;vDTLinux联盟
std::cout << "Derived8 is kind of Template? " << is_kind_of::yes << std::endl;vDTLinux联盟
std::cout << "Derived9 is kind of Template? " << is_kind_of::yes << std::endl;vDTLinux联盟
vDTLinux联盟
std::cout << "Derived1 is kind of AnotherTemplate? " << is_kind_of::yes << std::endl;vDTLinux联盟
std::cout << "Derived2 is kind of AnotherTemplate? " << is_kind_of::yes
<:string><:complex<:complex<:endl;
<:endl;
<:endl;
<:endl;
<:endl;
<:endl;
<:string><:endl;
<:complex<:endl;
<:complex<:endl;
<:complex<:string><:complex<:complex<:string><:complex<:complex<< std::endl;std::cout
<:string><:complex<:complex<:endl;
<:endl;
<:endl;
<:endl;
<:endl;
<:endl;
<:string><:endl;
<:complex<:endl;
<:complex<:endl;
<:complex<:string><:complex<:complex<:string><:complex<:complex << "Derived3 is kind of AnotherTemplate? " << is_kind_of::yes << std::endl;vDTLinux联盟
std::cout << "Derived4 is kind of AnotherTemplate? " << is_kind_of

来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
    无相关信息
栏目更新
栏目热门