Effective C++ Item 48 认识 template 元编程

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


经验:Template metaprogramming (TMP, 模板元编程)可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率
示例1:

template<typename IterT, typename DistT>
void advance(IterT &iter, DistT d){
	if(typeid(typename std::iterator_traits<IterT>::iterator_catogory) == typeid(std::random_access_iterator_tag)){
		iter += d;
	}else{
		if(d >= 0) { while(d--) ++iter;}
		else {while(d++) --iter;}
	}
}


std::list<int>::iterator iter;
advance(iter, 10); //当这里调用时,将会具体化出下面的函数


void advance(std::list<int>::iterator &iter, int d){
	if(typeid(typename std::iterator_traits<std::list<int>::iterator>::iterator_catogory) == typeid(std::random_access_iterator_tag)){
		iter += d; //编译出错。因为 std::list<int>::iterator 不支持 +=  
	}else{
		if(d >= 0) { while(d--) ++iter;}
		else {while(d++) --iter;}
	}
}


解析:虽然不会执行 += 那一行,但编译器必须确保所有源码都有效。


纠正:融合重载技术后,traits classes 有可能在编译期对类型执行 if...else 测试 --> 见 Item 47


示例2:TMP主要是个函数式语言,主要涉及递归模板具体化
template<unsigned n>
struct Factorial{
	enum {value = n * Factorial<n-1>::value }; //enum hack, 声明一个名为 value 的 TMP 变量来保存当前计算所得的阶乘值 
};


template<> //全特化。 当 Factorial<0> 的值是1
struct Factorial<0>{
	enum {value = 1};
};


int main(){
	std::cout << Factorial<5>::value;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值