大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
模板类型参数前的关键字可以为typename和class。
函数模板定义如下:
//i是非类型参数,编译时被求值
template <typename U, class T>
U Add(U u, T t, 
int i)
{
    
return u+t+i;
}


    int i =3;
    
char c = 4;
    
int r = Add(3,4,6);        //模板实例化,隐式的
    cout<<r<<endl;


类模板
#include <iostream>

using namespace std;

//i是非类型参数,
//模板支持缺省参数
template <typename U = intint i = 8>
class A
{
public:
    A():value(i)
{}
    U GetValue()
{return value;}
    
void SetValue(U u);
private:
    U value;
}
;

//类模板的成员函数定义
template<typename U, int i>
void A<U, i>::SetValue(U u)
{
    value 
= u;
}


int main()
{
    A
<> b;        //A<>是一个用缺省模板参数实例化的模板类
    cout<<b.GetValue()<<endl;

    A
<int6> a;
    cout
<<a.GetValue()<<endl;
    a.SetValue(
3);
    cout
<<a.GetValue()<<endl;
    
    
return 0;
}

模板实例化发生在编译期,如下是一个应用:
有这么一组数列1,1,2,3,5,8,13,21……最前一,二项是1,以后每一项是其前两项的和。计算第N项的值。
#include <iostream>

using namespace std;

//类模板定义
template <int n>  
class f
{
public:
 
enum {value=f<n-1>::value+f<n-2>::value};
}
;

//类模板特化
template<>
class f<1>
{
public:
    
enum {value = 1};
}
;
//类模板特化
template<>
class f<2>
{
public:
    
enum {value = 1};
}
;

//函数
long F (long n)
{
 
if (n==1 || n==2)  
 
{
  
return 1;
 }

 
else      
 
{
  
return F(n-1)+F(n-2);
 }

}



int main()
{
    
//编译期求值
    cout<<f<45>::value<<endl;
    
//运行期求值
    cout<<F(45)<<endl;
    
return 0;
}

程序的输出第一行很快,因为编译期求值,后一行函数调用运行期求值。
posted on 2009-06-12 15:26 大胖 阅读(154) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理