C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参相关的知识,希望对你有一定的参考价值。
1. 类型参数可以使用任何名字(通常命名为 T)
template <typename Foo> Foo calc (const Foo& a, const Foo& b){
Foo tmp = a; / / tmp 的类型与参数和返回类型一样
//...
return tmp; // 返回类型和参数类型一样
}
1.1 模板参数与作用域
一个模板参数名的可用范围:声明之后, 至模板声明或定义结束之前。
- 与任何其他名字一样, 模板参数会隐藏外层作用域中声明的相同名字。
typedef double A;
template <typename A, typename B> void f (A a, B b){
/ / tmp 的类型为模板参数 A 的类型 , 而非 double
/ / 错误: 重声明模板参数 B
A tmp = a;
double B;
}
- 一个模板参数名在一个特定模板参数列表中只能出现一次(与大多数其他上下文不同, 在模板内不能重用模板参数名)
// 错误: 非法重用模板参数名 v
template〈typename V, typename V>//...
1.2 模板声明
模板声明必须包含模板参数
/ / 声明但不定义 compare 和 Blob
template <typename T> int compare (const T &, const T & );
template <typename T> class Blob;
- 与函数参数相同, 声明中的模板参数的名字不必与定义中相同,但必须有相同数量和种类( 即, 类型或非类型) 的参数。
/**************3 个 calc 都指向相同的函数模板**************/
//模板的声明
template ctypename T> T calc (const T &, const T& ); / / 声明
template <typename U> U calc (const U&, const U& ); / / 声明
//模板的定义
template <typename Type> Type calc (const Types a, const Types b) { / •" / }
1.3 使用类的类型成员
为了处理模板, 编译器必须知道名字是否表示一个类型。
例如, 假定 T 是一个类型参数的名字,语句有歧义: T::sizetype * p;
- 一个名为 p 的变量?
- 一个名为 SiZe_type 的 static 数据成员与名为 p 的变量相乘?
默认情况下, C++语言假定通过作用域运算符访问的名字不是类型。 因此, 如果我们希望使用一个模板类型参数的类型成员, 就必须显式告诉编译器该名字是一个类型。 我们通过使用关键字 typename 来实现这一点:
//top 函数期待一个容器类型的实参, 它使用 typename 指明其返回类型并在 c
//中没有元素时生成一个值初始化的元素( 参见 7.5.3 节, 第 262 页) 返回给调用者.
template <typename T> typename T::value_type top (const T& c ) {
if (!c.empty ( ) )
return c.back ( ) ;
else
return typename T::value_type ( );
}
以上是关于C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参的主要内容,如果未能解决你的问题,请参考以下文章
C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move
C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化
C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化
C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化