C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包相关的知识,希望对你有一定的参考价值。
1. 使用可变参数模板与 forward 机制来编写函数, 实现将其实参不变地传递给其他函数(保持实参的原始类型)
1.1 eg
class StrVec {
public:
template <class... Args> void emplace_back (Args&&...);
}
模板参数包扩展中的模式是 &&, 意味着每个函数参数将是一个指向其对应实参的右值引用。
template <class... Args> inline void StrVec::emplace_back (Args && args)
{
chk_n_alloc ( ); / / 如果需要的话重新分配 StrVec 内存空间
alloc.construct (first_free++, std::forward<Args> (args)...);
}
1.2 std::forward (args ) …
- 扩展了模板参数包 Args
- 扩展了函数参数包std::forward (ti) :
其中Ti表示模板参数包中第i个元素的类型, ti表示函数参数包中第i个元素。
eg.
StrVec svec;
//将cccccccccc 添加为新的尾元素
//construct 调用中的模式会扩展出 std::forward<int> (10) , std::forward<char> (c)
svec.emplace_back (10, 'c' );
如果用一个右值调用 emplace_back, 则construct 也会得到一个右值。
eg.
svec.emplace_back(si+s2); // 使用移动构造函数
//传递给 emplace_back 的实参是一个右值, 它将以如下形式传递给
//std::forward<string> (string("the end" ))
forward的结果类型是 string&&, 因此 construct 将得到一个右值引用实参。 construct 会继续将此实参传递给 string 的移动构造函数来创建新元素。
以上是关于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 模板和泛型编程)实例化