那个学习规律是这样的:你常常一次性学习很多东西,但是却绝大部分你实际工作中运用不到,结果就是不久就忘光光。这是可悲的人体结构决定的,但是有折衷的办法,那就是做一个备忘录,因为道理你已经学过了,缺少的是一点让你能够回忆的帮助。
C++模板相当的精妙,有着千奇百怪的专业术语,看上去差不多的术语,指的事情却差很远。下面流水账的记录一下他们的特点:
类模板全局特化:
template<typename T>

class A
{ public: void showMe()
{ cout << "A" << endl; } };
//所谓的特化
template<>

class A<int>
{ public: void showMe(); };
//不能写template<>前缀

void A<int>::showMe()
{ cout << "A<int>" << endl; }
类模板局部特化:
template<typename T1, typename T2>
class A;
template<typename T> class A<T,T>; //局部特化1
template<typename T> class A<T, int>; //局部特化2
template<typename T1, typename T2> class A<T1*, T2*>; //局部特化3

类模板参数缺省:
template<typename T = int>
class A;
A<> a; //相当于A<int> a; 遗憾的是不能去掉<>
类模板的类模板参数:
template<template<typename Ta> class Tb>

class A
{ Tb<int> obj1; Tb<float> obj2 };

成员函数模板:

template<typename T> class A
{ public: template< typename T2> void showMe( T2 );};
//恶心的定义
template<typename T>
template<typename T2>

void A<T>::showMe( T2 obj )
{ cout << "A::showMe(" << obj << ") " << endl; }

类模板成员全局特化:
template<typename T>

class A
{ static int obj; void showMe(); };
//静态数据成员全局特化
template<> int A<void>::obj = 110;
//普通成员全局特化

template<> void A<void>::showMe()
{ cout << "A<void>::showMe()" << endl; }

函数模板:
template<typename T> T max( T const&, T const& );
函数模板全局特化:
template<typename T> T max( T const&, T const& );
//特化
template<> T max( int const&, int const& ); //可以借助函数参数推断模板参数

非类型参数:

template<int size>class A
{};
template<int lenght> void max(
);

显式实例化:

template<typename T> class A
{};
template class A<int>; //生成A<int>的实现,这是一种编译器优化

备注1:全局特化后并非模板,可以看成模板的其中一个实例,因此应该避免重定义的情况出现。
备注2:非类型参数只能是整型常数。
552

被折叠的 条评论
为什么被折叠?



