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

Bri*_*ndy 13 c++ templates metaprogramming template-meta-programming

这个问题之所以存在是因为它具有历史意义,但它不被认为是本网站的一个好的,主题上的问题,所以请不要将它作为证据,你可以在这里提出类似的问题.

更多信息:https://stackoverflow.com/faq


您在C++中看到的最酷的元编程实例是什么?
您在C++中看到的元编程有哪些实际用途?

Fer*_*cio 24

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


Jar*_*Par 21

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

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

   void SomeMethod(IFoo* pFoo) {
        CFooImpl *p = (CFooImpl)pFoo;
   }
Run Code Online (Sandbox Code Playgroud)

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

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

template <typename T>
CComPtr<T>& operator=(const T* pT)  { 
// CComPTr Assign logic
}
template <>
CComPtr<IFoo> operator=<IFoo>(const IFoo* pT) {
  COMPILE_ERROR();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Seb*_*ach 14

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

metatrace的例子

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


Ces*_*arB 12

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


Joh*_*ook 8

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

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