可以利用元编程技术实现编译期断言和编译期约束.ppt

可以利用元编程技术实现编译期断言和编译期约束.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

ailuojue + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档