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

C++ 類模板部分特化與成員特化完整指南

     編輯:關於C++

類模板特化機制

類模板支援部分特化(針對型別分類如左值/右值/指標),函數模板僅支援完全特化。部分特化需與原始模板同名、參數數量相同,但參數型別更具體(更匹配)。

部分特化:左值/右值區分

/* 
 * CppPrimer.cpp - 類模板部分特化範例
 * Created on: 2013.12.9
 * Author: Caroline 
 * eclipse cdt, gcc 4.8.1
 */
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

// 原始模板
template<typename T>
struct myclass {
    void print() { std::cout << "myclass!" << std::endl; }
};

// 部分特化:左值引用
template<typename T>
struct myclass<T&> {
    void print() { std::cout << "myclass! lvalue" << std::endl; }
};

// 部分特化:右值引用
template<typename T>
struct myclass<T&&> {
    void print() { std::cout << "myclass! rvalue" << std::endl; }
};

int main(void) {
    int i(1988);
    int& ri = i;
    
    myclass<decltype(1988)> mc;      // 原始版本:int
    mc.print();
    
    myclass<decltype(ri)> mcl;     // 左值版本:int&
    mcl.print();
    
    myclass<decltype(std::move(i))> mcr; // 右值版本:int&&
    mcr.print();
    
    return 0;
}

輸出結果

myclass!
myclass! lvalue
myclass! rvalue

成員特化

類模板可單獨特化特定成員函數,使不同實例化類別使用特化版本:


template <typename T>
class Widget {
public:
    void process() { /* 通用實作 */ }
};

// 特化 int 版本的 process
template <>
void Widget<int>::process() {
    std::cout << "int specialized process" << std::endl;
}

關鍵規則總結

  • 部分特化:類模板專有,函數模板無此機制
  • 參數匹配:特化參數必須比原始模板更具體(如 T& 比 T 具體)
  • 成員特化:需在類外定義,語法 template<> void Class<T>::func()
  • 完全特化:template<> class Class<int>,所有參數固定
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved