1、基本概念
#include <iostream>
// 函数模板
template<typename T>
bool equivalent(const T& a, const T& b)
{
return !(a < b) && !(b < a);
}
// 类模板(.h)
template<typename T=int> // 默认参数
class bignumber
{
T _v;
public:
bignumber(T a) : _v(a) { }
inline bool operator<(const bignumber& b) const; // 等价于 (const bignumber<T>& b)
};
// 在类模板外实现成员函数(.cpp)
template<typename T>
bool bignumber<T>::operator<(const bignumber& b) const
{
return _v < b._v;
}
int main()
{
bignumber<> a(1), b(1); // 使用默认参数,"<>"不能省略
std::cout << equivalent(a, b) << '\n'; // 函数模板参数自动推导
std::cout << equivalent<double>(1, 2) << '\n';
std::cin.get(); return 0;
}
1.1 模板类
template <typename T1, typename T2>
struct Test
{
T1 t1;
T2 t2;
};
template <typename T, size_t size>
class Array
{
public:
Array();
T &at();
size_t size() const;
private:
T data_[size];
};
void Demo()
{
Array<int, 5> arr; // 实例化,并创建对象
arr.at(1) = 6;
}
1.2 模板函数
// 普通模板函数
template <typename T>
void show(const T &item)
{
std::cout << item << std::endl;
}
class Test
{
public:
// 模板成员函数
template <typename T>
void mem_func(const T &item) {}
};
// 模板lambda表达式(只能是全局变量承载)
template <typename T>
auto f = [](const T &item) {}
调用方法:
show<int>(5);
Test t;
t.mem_func<double>(5.1);
f<char>('A');
1.3 模板全局常量
// 用于引导模板全局常量的模板类(用于判断一个类型的长度是否大于指针)
template <typename T>
struct IsMoreThanPtr
{
static bool value = sizeof(T) > sizeof(void *);
};
// 全局模板常量
template <typename T>
constexpr inline bool IsMoreThanPtr_v = IsMoreThanPtr<T>::value;
1.4 变参
1.5 实例化
- 隐式实例化(implicit instantiation):当使用实例化的模板时自动地在当前代码单元之前插入模板的实例化代码,模板的成员函数一直到引用时才被实例化;
- 显式实例化(explicit instantiation):直接声明模板实例化,模板所有成员立即都被实例化;