STL
模板编程的产生
模板是一种能够产生代码的代码.
它能够节省我们的代码量.
面向过程
- 一种动物一个
- 关联关系
- 种类越多类越多

接近实时, 但是代码量大, 难维护, 强聚合.
面向对象
- 抽象父类
- 接口更简单
- 利用多态自动匹配

接口更简单, 代码结构清晰, 但是设计难度大.
泛型编程
- 自动推导

代码自动生成, 代码量小, 难维护
模板编程产生是为了解决实际设计中的一些问题.
模板编程
与宏的区别
- 宏: 编译时替换.
模板: 编译时生成.
- 对T类进行拷贝, 然后生成对应类型的代码
一些特点
模板只会和它的下一句话相结合
template <typename T> // 类模板
class Demo // 模板类
{
public:
Demo(T in) {};
};
class Demo2{}; // 普通类模板定义时, 可以有N个类型定义占位符
// 可以有很多个typename
template <typename T, typename T2> // 类模板
class Demo // 模板类
{
public:
Demo(T2 in) {};
private:
T TDemo;
T2 T2Demo;
};模板定义时可以传递参数, 我们称之为模板参数
// 还能有实际存在的类型
// SIZE就是一个参数, 叫 模板参数, 可以直接使用
template <typename H, int SIZE = 10> // 类模板
class Demo2 // 模板类
{
Demo2()
{
size_ = SIZE;
}
private:
int size_;
};模板参数可以是推导的类型
// 还可以是推导类型
template <typename H, H tmp> // 类模板
class Demo3 // 模板类
{
Demo3()
{
hDemo = tmp;
}
private:
H hDemo;
};模板参数必须是一个常量
template <typename H, H tmp> // 类模板
class Demo // 模板类
{
Demo3()
{
hDemo = tmp;
}
private:
H hDemo;
};
template <typename T, char tmp> // 类模板
class Demo2 // 模板类
{
Demo3(T t)
{
n_ = tmp;
}
private:
char n_;
};
int main()
{
int n = 10;
//Demo<int, n> d(); // 模板参数必须是常量
Demo<int, 10> d();
Demo2<double, 'H'> d2(0.0);
return 0;
}模板语句还可以修饰函数, 我们称函数为 模板函数
template<typename T> // 函数模板
void Swap(T& lhs, T& rhs) // 模板函数
{
T tmp = lhs;
lhs = rhs;
rhs = tmp;
}_函数模板_会进行推导, 会推导你参数的类型.
template<typename T> // 函数模板
void Swap(T& lhs, T& rhs) // 模板函数
{
T tmp = lhs;
lhs = rhs;
rhs = tmp;
}
int main()
{
int lhs = 10, rhs = 20;
Swap(lhs, rhs);
return 0;
}模板函数是能够重载的
template<typename T> // 函数模板
void Swap(T& lhs, T& rhs) // 模板函数
{
T tmp = lhs;
lhs = rhs;
rhs = tmp;
}
template<typename T1, typename T2> // 函数模板
void Swap(T1& lhs, T2& rhs) // 模板函数
{
T1 tmp = lhs;
lhs = (T1)rhs;
rhs = (T2)tmp;
}
void Swap(char& lhs, char& rhs)
{
char tmp = lhs;
lhs = rhs;
rhs = tmp;
}
int main()
{
{
int lhs = 10, rhs = 20;
Swap(lhs, rhs); // 模板函数生成 Swap<int>
}
{
int lhs = 10;
double rhs = 20;
Swap(lhs, rhs); // 模板函数生成 Swap<int, double>
}
{
char lhs = 'H', rhs = 'x';
Swap(lhs, rhs); // 调用Swap(char, char)
}
return 0;
}
在模板中的重载是_不能提升转换_的
template <typename T>
T GetMax(T lhs, T rhs)
{
return lhs > rhs ? lhs : rhs;
}
int main()
{
GetMax(1, 2);
GetMax('a', 'b');
// GetMax('a', 1); // 错误, 模板函数中的重载是不能提升转换的.
GetMax<int>('a', 1); // 强制指定类型
return 0;
}未完待续...
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-03-06 at 03:20 pm