就个人而言,我认为Boost.Spirit是一个非常神奇的元编程实例.它是一个完整的解析器生成器,允许您使用C++语法表达语法.
就个人而言,我认为Boost.Spirit是一个非常神奇的元编程实例.它是一个完整的解析器生成器,允许您使用C++语法表达语法.
元编程的最实际用途是将运行时错误转换为编译时错误.
示例:让我们调用接口IFoo.我的一个程序处理了一个COM对象,它有多条到IFoo的路径(非常复杂的继承层次结构).不幸的是,底层的COM对象实现没有意识到他们有多条路径到IFoo.他们认为它总是最左边的一个.所以在他们的代码中,以下模式非常常见
void SomeMethod(IFoo* pFoo) { CFooImpl *p = (CFooImpl)pFoo; }
第二个IFoo虽然导致生成的"p"指针完全无效(多重继承是危险的).
长期解决方案是让COM对象所有者解决此问题.短期虽然我需要确保我总是返回正确的IFoo.我可以通过使用QI并避免对IFoo进行任何隐式转换来保证我拥有适当的IFoo.所以我创建了一个新的CComPtr <>实现,并将以下覆盖添加到equal方法中.
templateCComPtr & operator=(const T* pT) { // CComPTr Assign logic } template <> CComPtr operator= (const IFoo* pT) { COMPILE_ERROR(); }
这很快就揭示了我隐含地投入到IFoo的每一个地方.
不是实际用法(除了可能用于编译器测试),但metatrace是一个Whitted-Style(即递归和确定性)光线跟踪器,它生成像编译时那样的图像:
在fixp.hh中可以看到一些更复杂的代码部分,它使用Heron方法实现定点sqrt,或者使用sphere.hh显示光线/球体交叉计算.
Blitz ++使用模板做了一些令人印象深刻的事情(例如,单个可读代码行可以转换为多维数组上的一组循环,自动针对最佳遍历顺序进行优化).
最酷的元编程示例:欺骗编译器计算素数列表.不太实用,但令人印象深刻.
一个实际用途是编译时断言语句,即如果布尔条件不成立则导致编译错误.
Loki由Andrei Alexandrescu撰写