当前位置:  开发笔记 > 编程语言 > 正文

您在C++中看到的最酷的元编程实例是什么?

如何解决《您在C++中看到的最酷的元编程实例是什么?》经验,为你挑选了6个好方法。

就个人而言,我认为Boost.Spirit是一个非常神奇的元编程实例.它是一个完整的解析器生成器,允许您使用C++语法表达语法.



1> Ferruccio..:

就个人而言,我认为Boost.Spirit是一个非常神奇的元编程实例.它是一个完整的解析器生成器,允许您使用C++语法表达语法.



2> JaredPar..:

元编程的最实际用途是将运行时错误转换为编译时错误.

示例:让我们调用接口IFoo.我的一个程序处理了一个COM对象,它有多条到IFoo的路径(非常复杂的继承层次结构).不幸的是,底层的COM对象实现没有意识到他们有多条路径到IFoo.他们认为它总是最左边的一个.所以在他们的代码中,以下模式非常常见

   void SomeMethod(IFoo* pFoo) {
        CFooImpl *p = (CFooImpl)pFoo;
   }

第二个IFoo虽然导致生成的"p"指针完全无效(多重继承是危险的).

长期解决方案是让COM对象所有者解决此问题.短期虽然我需要确保我总是返回正确的IFoo.我可以通过使用QI并避免对IFoo进行任何隐式转换来保证我拥有适当的IFoo.所以我创建了一个新的CComPtr <>实现,并将以下覆盖添加到equal方法中.

template 
CComPtr& operator=(const T* pT)  { 
// CComPTr Assign logic
}
template <>
CComPtr operator=(const IFoo* pT) {
  COMPILE_ERROR();
}

这很快就揭示了我隐含地投入到IFoo的每一个地方.


我认为称这种元编程是非常宏伟的.我没有看到选择,递归或任何其他编译时编程结构.
这是元编程吗?看起来像一个简单的专业化.
这真的很聪明-太棒了!

3> Sebastian Ma..:

不是实际用法(除了可能用于编译器测试),但metatrace是一个Whitted-Style(即递归和确定性)光线跟踪器,它生成像编译时那样的图像:

metatrace的例子

在fixp.hh中可以看到一些更复杂的代码部分,它使用Heron方法实现定点sqrt,或者使用sphere.hh显示光线/球体交叉计算.



4> CesarB..:

Blitz ++使用模板做了一些令人印象深刻的事情(例如,单个可读代码行可以转换为多维数组上的一组循环,自动针对最佳遍历顺序进行优化).



5> John D. Cook..:

最酷的元编程示例:欺骗编译器计算素数列表.不太实用,但令人印象深刻.

一个实际用途是编译时断言语句,即如果布尔条件不成立则导致编译错误.



6> 小智..:

Loki由Andrei Alexandrescu撰写

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有