如何创建一个 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_back
,emplace_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
我正在创建自定义 ArrayList/Vector class,但在创建 emplace_back 函数时遇到问题。如何创建与 ArrayList 的 "value_type class" 的构造函数相同的参数?
emplace_back
和类似的函数(std::make_shared
等)不需要了解他们试图构建的 value_type
的任何信息。这要归功于 C++11 中引入的 parameter packs。
使用参数包,您可以创建一个接受任意数量(任意类型)参数的函数。
假设您已实施 push_back
,emplace_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