条款47 请使用traits clases表现类型信息
5种STL迭代器分类:
i、input迭代器:只能向前移动,一次一步,客户只可读取(不能涂写)它们所指的东西,而且只能读取一次。代表有istream_iterator;
ii、output迭代器:只向前移动,一次一步,客户只可涂写它们所指的东西,而且只能涂写一次。代表有ostream_iterator;
iii、forward迭代器:兼容上述两种迭代器且可以读或写其所指物一次以上;
iv、Bidirectional迭代器:兼容forward迭代器,除了可以向前移动,还可以向后移动。代表有list、set、multiset、map、multimap;
v、randon access迭代器:兼容forward迭代器,此外还可以执行“迭代器算术”,即可以在常量时间内向前或向后跳跃任意距离。代表有vector、deque和string;
5种分类,C++STL库提供专属卷标结构如下,
struct input_iterator_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag:public input_iterator_tag{};
struct bidirectional_iterator_tag:public forward_iterator_tag{};
struct random_access_iterator_tag:public bidirectional_iterator_tag{};
接下去的部分是讲解Traits的iterator_traits的应用,讲真的,没看太明白,就不再写下去,以后要是遇见的这方面的实际运用,再回过头来细细分析。
条款48 认识template元编程(Template metaprogramming)
TMP:以C++写成、执行于C++编译器内的程序。一旦TMP程序结束执行,其输出,也就是从template具现出来的若干C++源码,便会一如往常地被编译。
TMP的两个伟大效力,i、它让某些事情更容易。(这一点对程序能力的功底要求比较深,感觉像是以经验换取编译速率的提升);ii、TMP执行于C++编译期,因此可以将工作从运行期转移到编译器。产生的好处就是,某些原本通常在运行期才能侦测到的错误,现在可在编译期找出来。
以下给出一个TMP的范例程序(TMP循环涉及“递归模板具现化”),
template<unsigned n>//泛化版本
struct Factorial {//一般情况:Factorial<n>的值是n乘以Factorial<n-1>的值
enum{value=n*Factorial<n-1>::value};
};
template<> //特化版本
struct Factorial<0> {//特殊情况:Factorial<0>的值是1
enum { value = 1 };
};
int main() {
cout << Factorial<5>::value << endl;
cout << Factorial<10>::value << endl;
return 0;
}
讲真地,初看,还真不太好理解上述代码。
TMP值得学习之处(当然就是优点)
i、TMP可以确保在编译器检测错误;
ii、矩阵运算,起加速作用,TMP软件可以使用较少的内存。写的不全,可参见P237;
iii、可以生成客户定制的设计模式,运用所谓policy-based design的TMP-based技术,有可能产生一些template用来表述独立的设计选项,然后可以任意结合它们,导致模式实现品带着客户定制的行为。(看到这,我是懵逼的,能力太弱,暂时先这样写吧,以后再回过头来看看!)
TMP的BUG
i、对,没法调试哈,很伤;
ii、依赖编程经验;
iii、编译期长,远长于不使用TMP的对应版本。
以上内容均来自Scott Meyers大师所著Effective C++ version3,如有错误地方,欢迎指正!相互学习,促进!!