模板真是牛叉啊
三、 基于C++ template的数值运算
计算一个常数N的阶乘
template<int N>
struct factorial{
static const int value = N * factorial<N-1>::value;
};
template<>
struct factorial<1>{
static const int value = 1;
};
当这个类模板实例化factorial<N>,就会接着实例化factorial<N-1>,直到实例化fatorial<1>为止。而你只需要实例化自己想要计算的N就行了,后面的一切全由编译器包办。例如我们要输出10的阶乘答案
std::cout<<factorial<10><<std::endl;
四、 借助上面数值计算的方法以产生更实用的代码
是否考虑过得到指针的原型,比如通过int*,得到int。我们可以写出下面的代码
template<typename T>
struct primitive_type{
typedef T value_type;
};
template<typename T>
struct primitive_type<T*>{
typedef T value_type;
};
typedef int* pint;
primitive_type<pint>::value_type obj=5;
std::cout<<obj<<std::endl;
现在可以明确obj不是int*,而是int类型。但是有个缺陷就是但T是int**时却的不到int,而是得到的int*,这并不是我们想要的答案。现在只需要其实稍微对primitive_type的偏特化版本作下简单的修改,就可以满足要求
template<typename T>
struct primitive_type<T*>{
typedef typename primitive_type<T>::value_type value_type;
};
typedef int**** pint;
primitive_type<pint>::value_type obj=5; 这个obj可以确认他是int,而不是int***
计算一个常数N的阶乘
template<int N>
struct factorial{
static const int value = N * factorial<N-1>::value;
};
template<>
struct factorial<1>{
static const int value = 1;
};
当这个类模板实例化factorial<N>,就会接着实例化factorial<N-1>,直到实例化fatorial<1>为止。而你只需要实例化自己想要计算的N就行了,后面的一切全由编译器包办。例如我们要输出10的阶乘答案
std::cout<<factorial<10><<std::endl;
四、 借助上面数值计算的方法以产生更实用的代码
是否考虑过得到指针的原型,比如通过int*,得到int。我们可以写出下面的代码
template<typename T>
struct primitive_type{
typedef T value_type;
};
template<typename T>
struct primitive_type<T*>{
typedef T value_type;
};
typedef int* pint;
primitive_type<pint>::value_type obj=5;
std::cout<<obj<<std::endl;
现在可以明确obj不是int*,而是int类型。但是有个缺陷就是但T是int**时却的不到int,而是得到的int*,这并不是我们想要的答案。现在只需要其实稍微对primitive_type的偏特化版本作下简单的修改,就可以满足要求
template<typename T>
struct primitive_type<T*>{
typedef typename primitive_type<T>::value_type value_type;
};
typedef int**** pint;
primitive_type<pint>::value_type obj=5; 这个obj可以确认他是int,而不是int***