03静态编程

当类模板产生实例时,编译器生成:

1.每个成员在类级别的签名

2.所有静态常量和typedef

3.严格需要的函数体

当需要同样的实例的时候,通过查找来找到。例如:

template <size_t N>
struct sum_of_integers_up_to
{
	static const size_t value = N + sum_of_integers_up_to<N-1>::value;
};
template <>
struct sum_of_integers_up_to<0>
{
	static const size_t value = 0;
};

int n9 = sum_of_integers_up_to<9>::value; 
int n8 = sum_of_integers_up_to<8>::value; 

n9的初始化化了10个模板实例化,从n9一直到n0. n8的初始化只需要一次查找。

大多数元函数都是使用递归实现的,编译复杂度是由元函数本身递归时要求模板实例的数量。

静态短路求值

template <typename T>
struct F
{
	typedef
		typename typeif<[[CONDITION]], instance_of<T>, G<T> >::type
		aux_t;
	typedef typename aux_t::type type;
};

只会编译instance_of<T>或者G<T>之一。

同样适用于常量:

typedef typename
	typeif<[[CONDITION]], static_value<size_t, 4>, alignment_of<T>>::type
	aux_t;
static const size_t value = aux_t::value;

隐藏模板参数

template <size_t N, bool TINY_NUMBER = (N<2)>
struct fibonacci
{
	static const size_t value =
		fibonacci<N-1>::value + fibonacci<N-2>::value;
};

template <size_t N>
struct fibonacci<N, true>
{
	static const size_t value = N;
};

通过默认模板参数来隐藏。

模板基类不在名字解析的范围内。

C++标准允许在参数推导之前,进行派生类到基类的转换。

后面是一些type_traits和typelist的东西,可以参考C++设计新思维

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值