Bri*_*ndy 13 c++ templates metaprogramming template-meta-programming
这个问题之所以存在是因为它具有历史意义,但它不被认为是本网站的一个好的,主题上的问题,所以请不要将它作为证据,你可以在这里提出类似的问题.
您在C++中看到的最酷的元编程实例是什么?
您在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的每一个地方.