默認模板實參
就像我們爲函數提供默認的實參一樣,我們也可以提供模板默認的實參,在新的標準中,我們可以爲函數和類模板提供默認的實參。而更早的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
前面已經說過了必須定義在一個文件內