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
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |