C++模板详细整理2

1 模板参数
和函数参数一样,模板参数名字程序员自己定义。通常将类型参数命名为 T 。但实际上我们可以使用任何名字。

template <typename FOO> FOO calc (const FOO& a,const FOO& b)
{
    FOO tmp = a;//tmp的类型与参数和返回类型一样
    return 0;
} 

1.1**模板参数与作用域**
和普通函数一样,模板参数名作用范围是在其声明之后,直到模板声明或定义结束之前。模板内不能重用模板参数名。

1.2**模板声明**
模板声明必须包含模板参数

template <typename T>int compare(const T&, const T&);
template <typename T> class Blob;

与函数参数相同,声明中的模板参数的名字不必与定义中的相同。

1.3使用类的类型成员
我们用作用域:: 来访问static成员和类型成员,在普通非模板代码中,编译器直到类的定义。因此,他知道通过作用域运算符访问的名字是类型还是static成员。
但对于模板就麻烦了。假设T是一个模板类型参数,当编译器遇到类似 T::Compare这样的代码时候,他不知道compare是一个类型成员还是一个static数据成员,直到实例化才知道。
因此,我们必须显式告诉编译器该名字是一个类型。我们通过关键字typename来实现这一点。

template <typename T>
typename T::value_type top(const T& c)
{
    if(!c.empty())
        return 0;
    else 
    {
        return typename T::value_type();
    }
}

1.4 默认模板实参

就像我们为函数参数提供默认实参一样,我们也可以提供默认模板实参,在新标准里,我们可以为函数和类模板提供默认实参。

template <typename T,typename F = less<T> >
int compare(const T &v1, const T &v2,F f = F())
{
    if(f(v1,v2)) return -1;
    if(f(v2,v1)) return 1
    return 0;
}

在这段代码中,我们为模板添加了第二个类型参数,名为F,表示可调用对象的类型。并定义了一个新的函数参数f,绑定到一个可调用对象上。
1.5 成员模板
一个类,可以包含本身是模板的成员函数,这个成员被称为成员模板,当然,成员模板不能是虚函数。
普通类的成员模板

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章