Рассмотрим фрагмент кода ниже:
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