文章目录

  • ​​一、类模板​​
  • ​​1.声明和定义都放在.h中​​
  • ​​2.类模板中的函数声明和定义分隔开​​
  • ​​3.声明放在.h文件,定义放在.cpp文件​​
  • ​​二、类模板的特化​​
  • ​​三、函数模板的特化​​

一、类模板

1.声明和定义都放在.h中

// Foo.h
template <typename T>
struct Foo
{
void doSomething(T param) {}
};

2.类模板中的函数声明和定义分隔开

// Foo.h
template <typename T>
struct Foo
{
void doSomething(T param);
};

#include "Foo.tpp"

// Foo.tpp
template <typename T>
void Foo<T>::doSomething(T param)
{
//implementation
}

3.声明放在.h文件,定义放在.cpp文件

声明和实现分离,include了头文件之后不会把实现的代码也加入到该编译单元。然后需要将所有用到的类型都显式的实例化。

// Foo.h
// no implementation
template <typename T> struct Foo { ... };

//----------------------------------------

// Foo.cpp
// implementation of Foo's methods

// explicit instantiations
template class Foo<int>;
template class Foo<float>;
// You will only be able to use Foo with int or float

二、类模板的特化

// primary helper template:
template <int SZ, bool = isPrime(SZ)>
struct Helper;
// implementation if SZ is not a prime number:
template <int SZ>
struct Helper<SZ, false>
{

};
// implementation if SZ is a prime number:
template <int SZ>
struct Helper<SZ, true>
{

};
template <typename T, std::size_t SZ>
long foo(std::array<T, SZ> const &coll)
{
Helper<SZ> h; // implementation depends on whether array has prime
number as size

}

三、函数模板的特化

//声明
template <class T>
PrimeTable* CreatePrimeTable();

//实现
template <>
PrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {
return new OnTheFlyPrimeTable;
}

//实现
template <>
PrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {
return new PreCalculatedPrimeTable(10000);
}
  • ref:​​C++模板类声明和定义几种写法​​,​​c++中模板_类模板的声明和定义​​,​​C++中的类模板定义及实例化​​