- 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
- 艺术疗法行业商业机会挖掘与战略布局策略研究报告.docx
- 智能家庭娱乐系统行业商业机会挖掘与战略布局策略研究报告.docx
- 医疗纠纷预防和处理条例与医疗事故处理条例的思考分享PPT课件.pptx
- 新冀教版(2025)七年级数学下册《6.1 二元一次方程组》习题课件.pptx
- 新冀教版(2025)七年级数学下册精品课件:6.2.3 二元一次方程组的解法代入、加减消元法的综合应用.pptx
- 导演节目行业市场发展趋势及投资咨询报告.docx
- 制作和服培训行业风险投资态势及投融资策略指引报告.docx
- 医疗转诊的行政服务行业消费市场分析.docx
- 文件装订行业市场发展趋势及投资咨询报告.docx
- 在线语言艺术教育行业分析及未来五至十年行业发展报告.docx
文档评论(0)