如何创建一个 emplace_back 方法?

How to create an emplace_back method?

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

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

使用参数包,您可以创建一个接受任意数量(任意类型)参数的函数。
假设您已实施 push_backemplace_back 可能如下所示:

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

但是有一个问题。传递参数可以改变它们的类型(尤其是当我们处理移动语义时:右值引用在传递给另一个函数时将变成左值引用)。这可能是不可取的——当传递左值或右值时,用户可能会重载方法来做不同的事情。
这就是 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