gpt4 book ai didi

c++ - 是否可以在单个通用引用方法中实现 std::vector 的两个 push_back(..) 方法?

转载 作者:行者123 更新时间:2023-12-04 07:47:47 25 4
gpt4 key购买 nike

我正在尝试实现 std::vector为了一些锻炼目的,我自己一个人。我的问题是关于 push_back(..)方法。此方法有两个重载,如下所示。

void push_back(const value_type& value);
void push_back(value_type&& value);
起初,我在两个不同的函数中实现了它们。对于前一个,我选择使用给定值复制构造新元素。对于后一种,我选择移动构造具有给定值的新元素。以下是我的实现:
template<class T>
void Vector<T>::push_back(const value_type& value)
{
if(size() == capacity()) // Size is about to surpass the capacity
grow(nextPowerOf2(capacity()), true); // Grow and copy the old content

new(data + sz++) value_type(value); // Copy construct new element with the incoming one
}

template<class T>
void Vector<T>::push_back(value_type&& value)
{
if(size() == capacity()) // Size is about to surpass the capacity
grow(nextPowerOf2(capacity()), true); // Grow and copy the old content

new(data + sz++) value_type(std::move(value)); // Move construct new element with the incoming
}
之后,我意识到我可以将这两个函数合并到一个采用通用引用的方法中,例如以下代码:
template<class T>
template<class U>
void Vector<T>::push_back(U&& value)
{
if(size() == capacity()) // Size is about to surpass the capacity
grow(nextPowerOf2(capacity()), true); // Grow and copy the old content

// Construct new element with the incoming
new(data + sz++) value_type(std::forward<U>(value));
}
我认为这个单一方法可以处理我试图用两种不同方法做的所有事情。有什么我想念的吗?这个操作以后会不会打扰到我?我不寻求向后兼容,所以你可以省略它。

最佳答案

第二个版本不等同于第一个。
在第一个中,您采用“对 T 的引用”类型的参数,而在第二个 U 中可以是任何类型,与 T 无关.
所以第二个版本实际上更像是一个emplace_backpush_back .它将接受任何值并尝试构造 T 的实例。使用它(尽管通常 emplace_back 需要一组参数,以获得更大的灵活性)。
您可以限制 U到与 T 兼容的类型使用 SFINAE,但是代码可能会变得比只有两个单独的重载更复杂。

template<class T>
template<class U, typename std::enable_if_t<std::is_convertible_v<std::decay_t<U>, T>, int> = 0>
void Vector<T>::push_back(U&& value)
{
// . . .
stdlibc++ 例如对于 vector::push_back 有两个单独的重载,但有 push_back(T&&)只是 delegatesemplace_back .所以也许你也可以这样做。

关于c++ - 是否可以在单个通用引用方法中实现 std::vector 的两个 push_back(..) 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67136353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com