Effective C++ 条款47、48

条款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,如有错误地方,欢迎指正!相互学习,促进!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值