模板真是牛叉啊

三、  基于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***

posted on 2004-07-02 17:05  ChenA  阅读(336)  评论(0编辑  收藏  举报

导航