如何创建 emplace_back 方法?

Pab*_*usz 2 c++ arraylist push-back stdvector emplace

I\xc2\xb4m 创建自定义 ArrayList/Vector 类,并且 I\xc2\xb4m 在创建 emplace_back 函数时遇到问题。如何创建与 ArrayList 的“value_type 类”的构造函数相同的参数?

\n

Yks*_*nen 7

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...));
}
Run Code Online (Sandbox Code Playgroud)

然而有一个问题。传递参数可以改变它们的类型(特别是当我们处理移动语义时:当传递给另一个函数时,右值引用将变成左值引用)。这可能是不可取的 - 当左值或右值传递时,用户可能会重载方法来执行不同的操作。
这就是完美转发的用武之地std::forward。使用std::forward,我们可以进一步传递参数,就像它们传递到函数中一样。

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

请参阅我的(非常糟糕的)示例:https://wandbox.org/permlink/KyQJU8rd2FGTTFLJ