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

时间:2008-10-26 02:45:37

标签: c++ templates metaprogramming template-meta-programming

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

10 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:19)

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

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

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

第二个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();
}

这很快就揭示了我隐含地向IFoo投下的每一个地方。

答案 2 :(得分:14)

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

metatrace example

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

答案 3 :(得分:12)

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

答案 4 :(得分:8)

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

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

答案 5 :(得分:8)

Loki

撰写的

Andrei Alexandrescu

答案 6 :(得分:4)

我不得不说Boost.Lambda,Boost.Function和Boost.Bind以及它们无缝地协同工作的方式。它们提供了一个非常灵活的界面,并使用一种非真正为它构建的语言尽可能简单地进行函数式编程。

答案 7 :(得分:2)

luabind是一个非常酷的实例,非常好的绑定dsl用于将C ++类绑定到lua

答案 8 :(得分:1)

BOOST_FOREACH

静态断言(提升版本here

(注意:在C ++ 11中引入了对基于范围的for循环和静态断言的内置支持)

答案 9 :(得分:0)

我不久前提出了一个问题:C++ Runtime Knowledge of Classes我从StackOverflow用户“Denice”得到的答案是网站Meatspace: C++ runtime class registration的网址。

我认为这是一种非常酷的方式来使用模板和实例化所有从基类派生的对象,所以当我有10个C ++文件时,它们都可以在底部添加AUTO_REGISTER_BASE(),当一切都已完成并链接,只有那些制作它的类/文件才会被注册,所以在运行时你可以在可用的不同类之间切换,那些不可用的类没有注册,因此无法被意外调用

有很多不同的操作系统依赖方式来做事件通知(select(),kqueue(),/ dev / epoll,Solaris有它自己的东西,poll()),我需要一种方法来拥有所有的类文件存在于目录中,但根据运行Makefile的操作系统,它只会编译某些文件。我需要一种方法在运行时知道哪些是可用的,并且让程序员使用库来选择他们的偏好,但是如果它不可用于仅使用对平台最有逻辑意义的那个(他们每个有权重分配给他们。)

上面的代码帮助我实现了这个目标,并进行了一些重大修改,但它帮助了我!