分享
 
 
 

C++元编程以及TML解析

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

本文属spanzhang原创,其blog地址为:http://blog.csdn.net/spanzhang。引用或转贴请注明出处,谢谢!!

C++ Meta Programming基本上都是用template来做,它是Generic Programming的一种。个人认为这个东西在实际的开发中不是特别有用,至少我还没有实际用过。TML(Type Manipunation Library)是作者开发的一个C++ Meta Programming库,它是纯粹为研究目的而写的。如果你看了代码不头晕,说明你心理抵抗力比较强!在TML中,所有的代码都运行在编译期,它只对类型做操作而不对数据做操作。在整体结构上和Standard Template Library (STL)相似,所不同的是TML将类型放入容器中进行操纵而STL将数据放入容器中进行操纵。当然,我这个小玩意还没有完全成型,就算成型了也不可能与STL相提并论。下面先从原理上来进入TML正题:

1、灵感来源(TML的基础)

看看下面的一个模板类:

template <typename A, typename B>

class someName

{

typedef CASE<1, A,

CASE<2, B

> > type_list;

typedef FIND<type_list, 2>::RET RETURN;

public:

typedef RETURN RET;

};

这个类有两个模板参数,在内部公共域仅提供了一个类型定义。我们将它翻译成如下格式:

META_PARAMETERS<META_PARAM A, META_PARAM B>

META_FUNCTION someName

{

META_VAR CASE<1, A,

CASE<2, B

> > type_list;

META_VAR FIND<type_list, 2>::RET RET;

META_RETURN:

META_VAR RET RETURN;

};

这样,原来的模板参数变成了函数参数,原来的类名someName变成了函数名,原来的类定义变成了函数体,以前的类私有域变成了函数执行运算的部分而公共域成了函数的返回部分。这样以来,我们可以做如下的定义(或者,现在应该叫运算才对):

META_VAR someName<clsA, clsB>::RETURN clsResult;

这个语句不会在运行期产生任何内存分配行为,而对于编译期来将将生成了一个新的类型。OK,TML的基本东西就这么多了。如下的一些宏构成了TML的基础部分:

#define META_EQUAL_TO :public

#define META_IS :public

#define META_FUNCTION class

#define META_PARAMETERS template

#define META_RETURN public

#define META_VAR typedef

#define META_PARAM typename

#define META_CONST(name,value) enum { name = (value) };

2、语句、运算和循环

TML的语句相对来说简单得多,一个最基本条件判断语句如下:

META_PARAMETERS<bool condition, META_PARAM Then, META_PARAM Else>

META_FUNCTION IF

{

META_PARAMETERS<int _condition>

META_FUNCTION Select { META_RETURN: META_VAR Then RET; };

META_FUNCTION Select<false> { META_RETURN: META_VAR Else RET; };

META_RETURN:

META_VAR Select<condition>::RET RET;

};

实现的时候是通过一个嵌套类Select的特化来完成判断操作。另外,说一句题外题内话,TML的所有返回都叫RET而不叫RETURN是因为写起来麻烦。

TML也有一些运算符,比如:

META_PARAMETERS<META_PARAM UnaryFunc1, META_PARAM UnaryFunc2>

META_FUNCTION OR META_IS UNARY_FUNCTION

{

META_RETURN:

META_PARAMETERS<typename Arg>

META_FUNCTION EXEC

{

META_RETURN:

META_CONST(RET, (EXEC_UNARY_FUNCTION<UnaryFunc1, Arg>::RET

||EXEC_UNARY_FUNCTION<UnaryFunc2, Arg>::RET));

};

};

我估计,你看到这段代码后根本就不知道它原来就是逻辑运算符OR的实现。其它的一些运算符号以后介绍。接下来一个比较头痛的事情是循环。在TML里,所有的循环都是通过类型迭代来完成的,什么是类型迭代,哎,我都岗不清楚,只可意会。看下面的例子:

META_PARAMETERS<META_PARAM MapList, META_PARAM Tag, META_PARAM Value>

META_FUNCTION PUSH_FRONT

{

META_VAR MapList::NEXT nextMap;

META_VAR MapList::VALUE VALUE;

META_VAR MapList::TAG TAG;

META_VAR MapList::PRIOR_TAG PRIOR_TAG;

META_VAR nextMap::TAG nextTAG;

META_VAR IF<

IS_SAME_TYPE::EXEC<nextTAG, map_private::END_NODE>::RET,

map_private::END_NODE,

PUSH_FRONT<nextMap, Tag, Value>

>::RET nextPushFront;

META_VAR IF<

IS_SAME_TYPE::EXEC<nextTAG, map_private::END_NODE>::RET,

map_private::MAP_NODE< TAG, VALUE, PRIOR_TAG, map_private::MAP_NODE<Tag, Value, TAG> >,

map_private::MAP_NODE< TAG, VALUE, PRIOR_TAG, nextPushFront::RET >

>::RET RET1;

META_RETURN:

META_VAR IF<

SIZE<MapList>::Value == 0,

map_private::MAP_NODE<Tag, Value>,

RET1

>::RET RET;

}; //PUSH_FRONT

nextPushFront在这里起到了关键的作用,它让类型迭代而产生我们想要的循环效果,最终从迭代的出口处得到我们想要的结果(RET)。

好了,TML的全部基础介绍完毕,这里下载。顺便提一句,长沙今天天气不错,很就没出太阳了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有