Как реализовать идеальную пересылку для контейнера?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как реализовать идеальную пересылку для контейнера?

Сообщение Anonymous »

Рассмотрим фрагмент кода ниже:
using List=std::vector;

List generate();

List a = generate();
List b = generate();

a += generate(); // append generate() output to a
a += b; // append b to a


Я хочу создать идеальный оператор вперед+=
так, чтобы += генерировать() перемещал элементы из метода Generate(), а += b копировал элементы из b.
Моя реализация:
template
DataList & operator+=(DataList &lhs, T &&rhs)
{
using value_type=typename std::remove_cvref_t;
static_assert(std::is_same_v);

lhs.reserve(lhs.size()+rhs.size());
for(auto &&data : rhs)
{
lhs.push_back(std::forward(data));
}
return lhs;
}


Похоже, что функцияward() всегда делает ход.
Полный код:
#include
#include
#include
#include

class Data
{
std::string value;

public:
Data(const Data &another) : value(another.value)
{}

Data(const std::string &another) : value(another)
{}

Data(Data &&another) : value(std::move(another.value))
{}

std::string to_string()
{
return value.empty()?"":value;
}
};

using DataList=std::vector;

DataList generate(const std::string &heading, size_t size)
{
DataList data;

for(size_t i=0;i

Подробнее здесь: https://stackoverflow.com/questions/798 ... -container
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»