默认模板实参
就像我们为函数提供默认的实参一样,我们也可以提供模板默认的实参,在新的标准中,我们可以为函数和类模板提供默认的实参。而更早的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
前面已经说过了必须定义在一个文件内