100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参

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

时间:2021-06-21 19:50:59

相关推荐

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/ / 错误: 重声明模板参数 BA tmp = a;double B;}

一个模板参数名在一个特定模板参数列表中只能出现一次(与大多数其他上下文不同, 在模板内不能重用模板参数名)

// 错误: 非法重用模板参数名 vtemplate〈typename V, typename V>//...

1.2 模板声明

模板声明必须包含模板参数

/ / 声明但不定义 compare 和 Blobtemplate <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 ( ) ;elsereturn typename T::value_type ( );}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。