c++ 模板部分隨筆(三) 模板參數

默認模板實參

就像我們爲函數提供默認的實參一樣,我們也可以提供模板默認的實參,在新的標準中,我們可以爲函數和類模板提供默認的實參。而更早的c++標準只允許我們爲類模板提供實參。

我們重寫compare,默認使用標準庫的less函數對象模板:

template <typename T,typename F = int>
int compare(const T &v1, const T &v2,F a)
{
    printf("%d\n",a);
}

int main()
{
    compare(1,2,3);
    return 0;
}

這樣我們就給F設置了一個默認的模板類型int

我們再來設置一個默認的class 試一下

#include <memory>
#include <cstring>
#include <vector>

#include <iostream>
//#include "template.h"

class A{
public:
    int a;
    A(){
        this->a = 3;
        std::cout<<"__construct"<<std::endl;
    }
    ~A()
    {
        std::cout<<"__destruct"<<std::endl;
    }
};

template <typename T,typename F = A>
int compare(const T &v1, const T &v2,F a)
{
    printf("%d\n",a.a);
}

int main()
{
    A data;
    compare(1,2,data);
    return 0;
}

16.1.4成員模板

一個類,可以包含本身是模板的成員函數,這種成員被稱爲成員模板。成員模板不能是虛函數。

普通(非模板類的成員模板)

作爲普通類包含成員模板的例子,我們定義一個類,類似unique_ptr使用默認刪除器類型,我們的類將包含一個重載的函數調用運算符,它接收一個指針並對此指針執行delete。與默認刪除器不同,我們的類還將在刪除其被執行時候打印一條信息。由於希望刪除器適用於任何類型,我們將調用運算符定義爲一個模板:

#include <memory>
#include <cstring>
#include <vector>

#include <iostream>
//#include "template.h"

class A{

};

class DebugDelete{
public:
    DebugDelete(std::ostream &s = std::cerr):os(s){

    }

    template <typename T> void operator()(T *p) const
    {
        os << "deleteing unique_ptr"<<std::endl;
    }

private:
    std::ostream &os;
};


int main()
{
    std::shared_ptr<A> data = std::make_shared<A>();
    int* a = new int(3);
    DebugDelete() (&data);
    return 0;
}

類模板的成員模板

對於類模板 我們也可以爲其定義成員模板。在這種情況下,類和成員各自有各自獨立的模板參數

與類模板的普通函數不同,成員模板是函數模板。當我們在類模板外面定義一個成員模板的時候,必須同時爲類模板和成員模板提供參數列表。類模板的參數列表在前,後面跟成員自己的模板參數列表。

//
// Created by root on 20-2-27.
//

#ifndef TEST_TEMPLATE_H
#define TEST_TEMPLATE_H
#include <vector>
#include <iostream>
// Created by root on 20-2-27.
//

template <typename T>class A{
public:
    template <typename It>
    A(It b,It e);
};

template <typename T>
template <typename It>
A<T>::A(It b,It e)
{

}

#endif //TEST_TEMPLATE_H

前面已經說過了必須定義在一個文件內

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