Effective C++ 条款 48:认识template元编程
来源:互联网 发布:供应链协同软件 编辑:程序博客网 时间:2024/06/03 18:46
(一)
template metaprogramming(模板元编程)是编写template-based c++程序并执行于编译期的过程。是以c++写成,执行于c++编译器内的程序。一旦TMP程序执行结束,其输出,也就是template具现出来的若干c++源码,便会一如往常的编译。
条款47指出,advance那个typeid-based解法的效率比traits解法低,因为此方案中,1.类型测试发于运行期而非编译器,2。运行期类型测试代码会出现在可执行文件中。traits解法就是tmp,它引发“编译期发生于类型身上的if。。。else计算。
advance的typeid-based实现方式可能导致编译期问题:
std::list<int>::iterator iter; advance(iter, 10);//无法通过编译下面是这一版advance针对上述调用而产生的:
void advance(std::list<int>::iterator& iter, int d) { if (typeid(std::iterator_traits<std::list<int>::iterator>::iterator_category) == typeid(std::random_access_iterator_tag)) { iter += d; //wrong! } else ... }list<int>::iterator是bidirectional不支持+=。我们知道绝不会执行+=那一行,但是编译器必须确保所有源码都有效,纵使是不会执行的代码。
所以我们要用TMP,而不要用typeid-based。
(二)
让我们看看循环,tmp藉由递归完成。
template<unsigned n> struct Factorial{ //一般情况 enum{value = n*Factorial<n-1>::value}; };template<> struct Factorial<0>{ //特殊情况 enum{value = 1}; };
tmp递归并不涉及递归函数调用,而是涉及“递归模板具现化”(recursive template instantiation)。
请记住:
(1)Template metaprogramming(TMP,模版元编程)可将工作由运行期移往编译期,因为得以实现早期错误侦测和更高的执行效率。
(2)TMP可被用来生成“基于政策选择组合”的客户定制代码,也可用来避免生成对某些函数类型并不适合的代码。
0 0
- 《Effective C++》:条款48:认识template元编程
- Effective C++ 条款 48:认识template元编程
- 条款48:认识template元编程
- 条款48:认识template元编程
- C++之认识template元编程(48)---《Effective C++》
- 《Effective C++》读书笔记之item48:认识template元编程
- Effective C++ Item 48 认识 template 元编程
- 条款48:认识template元编
- [翻译] Effective C++, 3rd Edition, Item 48: 感受 template metaprogramming(模板元编程)
- 条款49:认识模板元编程
- 通过factorial认识template元编程
- C++template元编程学习心得--数据类型
- C++template元编程学习心得-switch结构
- 【Effective C++】条款48: 重视编译器警告
- 【Effective C++】条款48: 重视编译器警告
- Effective C++(条款48-50)
- Effective C++:条款01
- Effective C++:条款02
- oracle 复制表结构与表数据
- Android-00 小白遇到的第一堆问题
- Python宝典第一章: 初识Python
- 关于火狐流浏器添加书签的中的书签名称
- PHP判断用户是电脑访问还是手机访问
- Effective C++ 条款 48:认识template元编程
- Linux core 调试
- FOJ1305 Terrible Sets
- tp的调试工具
- 树莓派的备份
- date
- linux more 命令
- jquery那点事之animate
- linux coredump调试