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
templatetypename 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 模板和泛型编程)实例化

C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参