当类模板产生实例时,编译器生成:
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++设计新思维