C++类模板和函数模板声明和定义几种写法
原创
©著作权归作者所有:来自51CTO博客作者喜欢打篮球的普通人的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 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++中的类模板定义及实例化