【问题标题】:How to create an emplace_back method?如何创建一个 emplace_back 方法?
【发布时间】:2020-03-11 20:42:09
【问题描述】:

我正在创建一个自定义 ArrayList/Vector 类,但在创建 emplace_back 函数时遇到了麻烦。如何创建与 ArrayList 的“value_type 类”的构造函数相同的参数?

【问题讨论】:

  • 发布您尝试过的内容。如果您不发布代码,我们无法告诉您您的代码有什么问题,并且不会为您编写代码。
  • emplace_back 成员函数不是基于包含的类型生成的。它们只是模板成员函数,其参数被推断为使用时提供的参数。由用户确保这些参数对构造新元素有意义。
  • TBH,我不明白反对意见。这是一个合理的问题 IMO。不,它不需要代码,任何在不知道如何编写此类函数的情况下尝试编写此类函数的尝试都将与解决方案大不相同,因此无关紧要。
  • 阅读std::forward 和一般的“完美转发”。

标签: c++ arraylist stdvector push-back emplace


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多