在新标准下,我们可以组合使用可变参数模板与forward机制来编写函数,实现将其实参不变地传递给其他函数。
标准库容器的emplace_back成员是一个可变参数成员模板,它用其实参在容器管理的内存空间中直接构造一个元素。
保持类型信息是一个两阶段的过程。首先,为了保持实参中的类型信息,必须将emplace_back的函数参数定义为模板类型参数的右值引用:
class StrVec
{
public:
template <typename ... Args>
void emplace_back(Args&& ...);
// 其他定义
};
模板参数包中的模式是&&,意味着每个函数参数将是一个指向其对应实参的右值引用。
其次,当emplace_back将这些实参传递给construct时,我们必须使用forward来保持实参的原始类型。
template <typename ... Args>
inline void StrVec::emplace_back(Args&& ... args)
{
// 如果需要的话重新分配StrVec内存空间
chk_n_alloc();
alloc.construct(first_free++, std::forward<Args>(args)...);
}