C++模板

2018/01/29 C 共 1195 字,约 4 分钟

函数模板

模板函数定义的一般形式如下所示:

typename也可以用class

template <class type> ret-type func-name(parameter list)
{
// 函数的主体
}

template <typename T>
inline T const& Max (T const& a, T const& b) 
{ 
    return a < b ? b:a; 
} 
int main ()
{

    int i = 39;
    int j = 20;
    cout << "Max(i, j): " << Max(i, j) << endl; 

    double f1 = 13.5; 
    double f2 = 20.7; 
    cout << "Max(f1, f2): " << Max(f1, f2) << endl; 

    string s1 = "Hello"; 
    string s2 = "World"; 
    cout << "Max(s1, s2): " << Max(s1, s2) << endl; 

return 0;
}

类模板

template <class T>
class Stack { 
private: 
    vector<T> elems;     // 元素 

public: 
    void push(T const&);  // 入栈
    void pop();               // 出栈
    T top() const;            // 返回栈顶元素
    bool empty() const{       // 如果为空则返回真。
        return elems.empty(); 
    } 
}; 

template <class T>
void Stack<T>::push (T const& elem) 
{ 
    // 追加传入元素的副本
    elems.push_back(elem);    
} 

C++ 中 typename 和 class 的区别

在 C++ Template 中很多地方都用到了 typename 与 class 这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?

相信学习 C++ 的人对 class 这个关键字都非常明白,class 用于定义类,在模板引入 c++ 后,最初定义模板的方法为:

template...... 这里 class 关键字表明T是一个类型,后来为了避免 class 在这两个地方的使用可能给人带来混淆,所以引入了 typename 这个关键字,它的作用同class 一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了:

template...... 在模板定义语法中关键字 class 与 typename 的作用完全一样。

底层实现

编译器并不是把函数模板处理成能够处理任意类的函数;编译器是根据函数模板调用时的具体类型产生不同的函数; 编译器会对函数模板进行两次编译:在声明的地方对模板代码本身进行编译(这次只进行简单纠错,替换),在调用的时候还会进行一次编译,这次会产生具体的函数体,并调用之。

Search

    Table of Contents