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

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板相关的知识,希望对你有一定的参考价值。

1. 可变参数模板( variadic template)

一个接受可变数目参数的模板函数或模板类。

1.1 参数包 (parameter packet)

可变数目的参数被称为参数包,存在两种参数包:

  • 模板参数包( template parameter packet), 表示零个或多个模板参数;
  • 函数参数包( function parameter packet ), 表示零个或多个函数参数。

1.1.1 一个省略号来指出一个模板参数或函数参数表示一个包

  • 在一个模板参数列表中, class…或 typename…指出接下来的参数表示零个或多个类型的列表: 一个类型名后面跟一个省略号表示零个或多个给定类型的非类型参数的列表。

  • 在函数参数列表中,如果一个参数的类型是一个模板参数包, 则此参数也是一个函数参数包。

1.1.2 举例

  • foo 是一个可变参数函数模板:一个名为 T 的类型参数,一个名为 Args的模板参数包。
  • foo 的函数参数列表:一个const &类型的参数(指向T的类型), 一个名为 rest 的函数参数包,
// Args 是一个模板参数包; rest 是一个函数参数包
// Args 表示零个或多个模板类型参数
// rest 表示零个或多个函数参数
template <typename T, typename... Args> void foo (const T &t, const Args & ... rest);
 
int i = 0; double d = 3.14; string s = "how now brown cow";
foo (i, s, 42, d);//包中有三个参数
foo (s, 42, "hi" ); //包中有两个参数
foo (d, s);//包中有一个参数
foo ("hi" );//空包

编译器会为 foo 实例化出四个不同的版本:

void foo (const int &, const strings, const int &, const doubles);
void foo (const strings, const int &, const char [ 3 ] & ) 
void foo (const doubles, const strings);
void foo (const char [3] &);

1.2 sizeof…运算符

当我们需要知道包中有多少元素时, 可以使用 sizeof…运算符。sizeof…也返回一个常量表达式, 而且不会对其实参求值:

template<typename ... Args> void g (Args ... args) {
	cout « sizeof... (Args) « endl; // 类型参数的数目
	cout « sizeof... (args ) « endl; // 函数参数的数目
}

以上是关于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 模板和泛型编程)模板实参