- 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
- 健美操运动的糖代谢.ppt
- 姜吉安-亚洲艺术中心.pdf
- 江西吉安彩鹬的繁殖生态学研究-四川动物.pdf
- 教保活动教案编写者程宜婷.doc
- 教科版科学第四册第4课.doc
- 教师研究着作-崇右影艺科技大学.pdf
- 教师专业发展的内涵及途径-山东教学研究.doc
- 接种异常反应调查处理预案.doc
- 杰出科学家-厦门大学附属中学.ppt
- 江苏省镇江市外国语学校2023-2024学年八上物理期末综合测试试题含.pdf
- 必威体育精装版国家开放大学电大本科《商法》多项选择判断名词解释题题库及答案.pdf
- 期末模拟试卷(试题)2024六年级上册数学北师大版含答案 .pdf
- 必威体育精装版浙美版小学三年级美术下册教案全册.pdf
- 无人机作文(精选10篇).pdf
- 江苏省南通市 2023-2024 学年度职业学校高三年级第一学期校际联考 旅游完整版72086269.pdf
- 必威体育精装版2022-GCP培训试题及答案.pdf
- 必威体育精装版办公桌椅采购合同范本 .pdf
- 民法典知识竞赛测试题题库(含答案解析) .pdf
- 模拟卷(北京专用,人教版1-8单元)2023-2024学年初中上学期期末.pdf
文档评论(0)