如何创建template_back方法

How to create an emplace_back method?

本文关键字:template back 方法 创建 何创建      更新时间:2023-10-16

我正在创建一个自定义ArrayList/Vector类,而我在创建template_back函数时遇到了问题。如何创建与ArrayList的"value_type class"构造函数相同的参数?

emplace_back和类似的函数(std::make_shared等(不需要知道他们试图构建的value_type的任何信息。这要归功于C++11中引入的参数包。

使用参数包,您可以生成一个接受任意数量的参数(具有任何类型(的函数
假设您已经实现了push_back,则emplace_back可能如下所示:

template<class... Args>
void emplace_back(Args&&... args)
{
push_back(value_type(args...));
}

然而,有一个陷阱。传递参数可能会改变它们的类型(尤其是当我们处理移动语义时:传递给另一个函数时,r值引用将变成l值引用(。这可能是不可取的——当传递l值或r值时,用户可能会重载方法来做不同的事情
这就是使用std::forward进行完美转发的原因。使用std::forward,我们可以像传递到函数中一样进一步传递参数。

template<class... Args>
void emplace_back(Args&&... args)
{
push_back(value_type(std::forward<Args>(args)...));
}

看看我的(非常糟糕的(例子:https://wandbox.org/permlink/KyQJU8rd2FGTTFLJ