首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 模板總結(上):定義、實例化、參數推導與非類型參數

     編輯:關於C++

一、模板定義

模板是類/函數的藍圖,參數化類型或值,實現編譯期多態(泛型編程)。

1. 函數模板

template 
int cmp(const T& a, const T& b) {
    if (a < b) return -1;
    if (b < a) return 1;
    return 0;
}

2. 類模板

template 
class Stack {
    void push(const T& v);
    // ...
};
template 
void Stack::push(const T& v) { /* ... */ }

類模板名實際為 Stack<T>,類外定義需帶模板參數列表。

二、模板參數分類

1. 類型參數

typename T / class T,代表任意類型。作用域遮蔽外部同名類型。用於類型聲明、返回值、參數等。

2. 非類型參數

編譯期常量值,如 int N、指針、引用、枚舉。限制:

  • 只能是整型、枚舉、指針、引用。
  • 模板內不可修改、不可取地址(視為常量)。
  • 實例化時必須提供常量表達式。
template 
class Array { T data[N]; };

3. 默認參數

  • 類模板:類型參數可有默認值(如 typename T = int),非類型參數亦可。
  • 函數模板:C++11 起類型參數可默認,非類型參數亦可。
template  class Buffer {};

三、實例化

1. 類模板:顯式/隱式

Stack s1;           // 隱式
template class Stack; // 顯式實例化(僅聲明類,不創建對象)

2. 函數模板:實參推導

調用 cmp(1, 2) → 推導 T=int 生成 cmp(int,int);cmp(1.0, 2.0) → 生成 cmp(double,double)。
推導規則:

  • 多參數必須一致匹配。
  • 不做隱式轉換(除 const 轉換、數組/函數退化為指針)。

3. 顯式實參指定

當返回類型無法從參數推導時,需顯式指定:

template 
T1 sum(T2 a, T3 b);

long res = sum(1, 10L); // 顯式指定 T1=long, T2=int, T3=long

四、typename 關鍵字用法

在模板內訪問嵌套類型成員時,必須加 typename 告訴編譯器這是類型而非靜態成員:

template 
void foo(T* p) {
    typename T::value_type v; // 必須加 typename
}

五、小結

本文涵蓋模板定義語法、參數分類、默認值、實例化機制、函數模板推導規則與顯式指定。下篇將講解成員模板、模板特化、別名模板、可變參數模板及 C++20 Concepts。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved