C++ 中的模板

類模板

template <typename T>
class A{
private:
    T x;
};

函數(shù)模板

template <typename T>
inline
const T& my_min(T& x, T& y) {
    return x < y ? x : y;
}

成員模板(member template)

成員模板其實(shí)就是一個類里面使用了一個模板函數(shù)。使用模板函數(shù)的時候是不需要指定參數(shù)類型的。

來看這個例子:

#include <iostream>
#include <vector>
#include <algorithm>
 
struct Printer { // generic functor
    std::ostream& os;
    Printer(std::ostream& os) : os(os) {}
    template<typename T>
    void operator()(const T& obj) { os << obj << ' '; } // member template
};
 
int main()
{
    std::vector<int> v = {1,2,3};
    std::for_each(v.begin(), v.end(), Printer(std::cout));
    std::string s = "abc";
    std::for_each(s.begin(), s.end(), Printer(std::cout));
}

結(jié)果:

1 2 3 a b c 

模板特化(specialization)

其實(shí)是對模板的某一種特定類型的解釋,比如下面這個例子:

#include <iostream>
#include <algorithm>

using std::cout;

template <typename T>
size_t hash(const T& x){
    return 0;
}

template <>
size_t hash(const char& x){
    return x;
}

int main() {
    char x1 = 'a';
    int x2 = 3;

    cout << "x1(char) hash: " << hash(x1) << '\n';
    cout << "x2(int) hash: " << hash(x2) << '\n';
}

模板偏特化

個數(shù)的偏

對于有多個模板參數(shù),我們可以選擇一個或者多個指定類型。比如看到 vector 的實(shí)現(xiàn):

template<typename T, typename Alloc=...>
class vector
{
  ...
}

特化第一個 typename:

template<typename Alloc=...>
class vector<bool, Alloc>
{
  ...
}

范圍的偏(partial specialization)

template <typename T>
class C
{
  ...
}

可以指定 T 是指針,應(yīng)該怎么做:

template <typename T>
class C<T*>
{
  ...
}

具體用法就是:

C<string> obj1;
C<string*> obj2;

模板模板參數(shù)

這個比較難理解,我先舉這樣一個例子。假如我們需要這樣一個類,它的成員變量有一個 std::list,list 的類型是 int。那么我們可以這樣寫:

class A{
private:
    std::list<int> l1;
};

那這個類能不能更通用化呢?list 的類型可以由用戶指定呢?

那么我們可以這么寫:

template <typename T>
class A{
private:
    std::list<T> l1;
};

再通用化一點(diǎn),把 list 換成任意容器,且這個容器存儲的東西也由用戶指定。

那么我們就可以這樣寫:

#include <iostream>
#include <list>

template<typename T, template<typename U, typename Alloc>class Container>
class A{
private:
    Container<T, std::allocator<T>> c;
};

int main() {

    A<int, std::list> a;

    return 0;
}

其中上面第二個模板參數(shù)就是模板模板參數(shù)。

再看下面這個是不是模板模板參數(shù):

template <class T, class Sequence = std::deque<T>>
class A{
    
};

這個就不是了,我們在使用的過程中要指定具體的類型,而不是模板。比如:

A<int> a;
A<int, std::list<int>> a;

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 技術(shù)交流QQ群:1027579432,歡迎你的加入! 1.Cpp中的模板template 模板是泛型編程的基礎(chǔ),泛...
    CurryCoder閱讀 1,511評論 0 2
  • 一、概述 二、模板定義與使用 ?1. 函數(shù)模板的定義與使用?2. 類模板的定義與使用 三、typename 的特殊...
    從不中二的憂傷閱讀 1,727評論 1 1
  • Hi!這里是山幺幺的c++ primer系列。寫這個系列的初衷是,雖然在學(xué)校學(xué)習(xí)了c++,但總覺得對這門語言了解不...
    山幺幺閱讀 509評論 0 1
  • 模板主要包括函數(shù)模板和類模板這兩種。函數(shù)模板技術(shù)定義了參數(shù)化的非成員函數(shù),這使得程序能夠使用不同的參數(shù)類型調(diào)用相同...
    小帥灬血閱讀 512評論 0 2
  • 1. 基本概念 1.1 什么是模板? 模板(Template)是允許函數(shù)或者類通過泛型(generic types...
    jdzhangxin閱讀 1,826評論 2 1

友情鏈接更多精彩內(nèi)容