- 1、本文档共52页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
模板元程序则由编译器在编译期解释执行
C++模板元编程技术与应用 荣耀 royal@ 动机 目录 历史 导入范例 导入范例 导入范例 主要思想 静态语言设施 静态语言设施 静态语言设施 控制结构 控制结构 控制结构 控制结构 控制结构 控制结构 数据结构 数据结构 数据结构 数据结构 数据结构 数值计算 数值计算 数值计算 数值计算 类型计算 类型计算 代码生成 代码生成 代码生成 代码生成 代码生成 代码生成 断言和契约 断言和契约 断言和契约 断言和契约 断言和契约 库 库 库 DSEL DSEL DSEL 结语 结语 资源 资源 资源 资源 The End // 自定义类型Test struct Test { enum {Value = 100}; }; template typename T struct Holder { T Value; static void f() { cout sizeof(T) endl; } // ... }; // 定义一个包含有char、int、Test和float的Typelist typedef TypeListchar, TypeListint, TypeListTest, TypeListfloat, Nil CIRF; typedef GenScatterHierarchyCIRF, Holder SH; 这个Holder模板决定了生成的各个类的能力 int main() { SH sh; cout (dynamic_castHolderchar(sh).Value = a) endl; cout (dynamic_castHolderint(sh).Value = 1) endl; cout (dynamic_castHolderfloat(sh).Value = 3.14f) endl; cout (dynamic_castHolderTest(sh).Value.Value) endl; // cout (dynamic_castHolderdouble(sh).Value = 3.14) endl; } GenScatterHierarchy将给定的TypeList中的每一个类型施加于一个由用户提供的基本模板Holder上,从而产生一个类层次结构。换句话说,生成的各类的能力,取决于客户提供的Holder模板的能力。 示例中生成了一个多重继承类层次结构,Holderchar, Holderint, Holderfloat, HolderTest之间没有任何关系,但它们都是SH的基类,即所产生的SH层次结构其实相当于: class SH: public Holderchar, public Holderint, public HolderTest, public Holderfloat; 利用元编程生成类层次结构最大的好处在于其灵活性:TypeList是可扩展的,其长度不但可以任意定制,而且对其更改后SH可以自适应地产生新的代码。Loki库中的Abstract Factory泛型模式即借助于这种机制实现在不损失类型安全性的前提下降低对类型的静态依赖性。 进一步了解typelist和相关的代码生成技术,以及Abstract Factory泛型模式,参见[注11]和[注15]。 可以利用元编程技术实现编译期断言和编译期约束 。 断言用于指定程序中某些特定点的条件应为“真”。如果该条件不为真,则断言失败,程序执行中断。大量使用断言可以在开发期捕捉许多错误。当然,若有可能,在编译期抓住错误更好。触发编译期断言的结果是导致程序无法通过编译。 编译期断言的实现方式并非仅限于模板元编程一种。 //主模板 templatebool struct StaticAssert; // 完全特化 template struct StaticAsserttrue {}; // 辅助宏 #define STATIC_ASSERT(exp)\ { StaticAssert((exp) != 0) StaticAssertFailed; } int main() { STATIC_ASSERT(01); } 声明STATIC_ASSERT宏是为了方便使用,否则用户如果写 StaticAssertfalse; 在有些编译器(例如GCC和Borlad C++)中编译报错,在另外一些编译器(例如VC++和Digital Mars)中则可以编译通过。也就是说,单单“提及”一下StaticAssert是不保险的,要强迫它完全实例化才能保证触发断言,例如 StaticAssert
您可能关注的文档
- 森林与生态环境下.PDF
- 桑名观光导览手册.PDF
- 森林生态环境保护-OK.PPT
- 森林植被恢复的理论和实践:用乡土树种重建当地森林-植物生态学报.PDF
- 森林植物检疫基础知识.DOC
- 森林草坪forestlawn一般意指墓园.PDF
- 森林生态补偿制度存在的问题及对策-JournalofNortheastern.PDF
- 森林经营规划-丰林集团.DOC
- 植物体中硒的生理学!生物化学及分子生物学-海洋科学.PDF
- 棒棒糖造型唇蜜可悬挂衣物椅子妈妈的怀抱.PPT
- GB/T 18282.1-2025医疗保健产品灭菌 化学指示物 第1部分:通则.pdf
- 《GB/T 18282.1-2025医疗保健产品灭菌 化学指示物 第1部分:通则》.pdf
- 市交通运输局局长2025年专题生活会对照“四个带头”含落实意识形态工作责任制方面个人对照检查发言提纲与乡镇(街道)围绕“四个带头”主题领导班子检视问题整改方案【2篇文】.docx
- 2025年市红十字会党支部书记、团市委党支部书记组织生活会“四个带头”个人对照检查发言材料【含意识形态工作责任制落实方面】2篇文.docx
- 市水利局党支部书记2025年组织生活会对照“四个带头”个人发言材料(含意识形态工作责任制落实方面)与市委领导班子围绕“四个带头”生活会查摆问题整改方案2篇文.docx
- 检察院领导班子2025年专题生活会对照“四个带头”检查材料与市民族宗教事务局党组书记、局长围绕“四个带头”生活会对照检查材料【含反面典型案例剖析】2篇文.docx
- 对照“四个带头”重点方面含反面典型案例查摆的问题解析生活会个人对照检查发言稿与市交通运输局局长“四个带头”含落实意识形态工作责任制方面个人对照检查发言提纲【2篇文】.docx
- 市水利局党支部书记2025年组织生活会对照“四个带头”个人发言材料(含意识形态工作责任制落实方面)与纪检委员“四个带头”方面个人对照检查材料【2篇文】.docx
- 2025年市中级人民法院领导班子、市投资促进局党支部书记对照“四个带头”方面生活会检视剖析材料(含典型案例剖析、意识形态)2篇文.docx
- 医院党委领导班子2025年检视问题整改落实方案与对照“四个带头”方面含反面典型案例查摆的问题解析生活会个人对照检查发言稿【2篇文】.docx
文档评论(0)