如何创建template_back方法
How to create an emplace_back method?
我正在创建一个自定义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
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 传递给std::function template的template参数究竟代表什么
- 在template中使用std::variant的template函数
- 推导 std::vector::back() 的返回类型
- C++ template for QList
- C++ - 为什么这里需要'template'关键字?
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 使用"std::enable_if_t" "function template has already been defined"
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- C++ class template
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 为什么编译器说"candidate template ignored: couldn't infer template argument 'InputIterator'"?
- 为什么在这种情况下我需要 .template
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- std::span constructor, libcxx vs libstdc++, template vs non-
- 模板函数参数到模板函数的"candidate template ignored: could not match ..."
- MacOS 上的 LLVM - 标准文件 iosfwd 中未知类型名称'template'
- std::get like (partial) template specialization
- 实现多类型算术运算符时如何解决"template argument deduction/substitution failure"
- 更新 Visual Studio 2017,现在出现编译错误 C7510:"回调":使用依赖模板名称必须以 'template' 为前缀