Как определить функцию для работы с семантикой перемещения и семантикой копирования? - PullRequest
4 голосов
/ 27 апреля 2020

Предположим, что я реализую коллекцию и хочу добавить в нее элемент, что-то вроде.

template <typename T>
class MyCollection
{
    void add(const T& element);
};

Теперь, поскольку добавление элемента обычно означает его копирование, по соображениям эффективности имеет смысл иметь следующую версию добавить также void add(T&& element). Теперь проблема в том, что, очевидно, код для обеих функций в точности один и тот же, с той лишь разницей, что и тип аргумента. Моя команда C ++ в настоящее время ограничена, но я хотел бы знать, есть ли простой идиоматический c способ написать add функцию один раз, не переписывая ее дважды?

Ответы [ 2 ]

6 голосов
/ 27 апреля 2020

Фактически это решается путем определения единственной перегрузки:

void add(T element) {
    where_it_is_actually_stored.insert(std::move(element));
}

Далее, в зависимости от того, добавляете ли вы lvalue, rvalue из перемещенного lvalue или временный объект, компилятор разрешит соответствующий конструктор, чтобы ваш аргумент значения был либо скопирован, либо перемещен.

4 голосов
/ 28 апреля 2020

Самым общим решением, я думаю, было бы на самом деле это. Это то, что обеспечивает стандартная библиотека, поэтому я предполагаю, что это делает ее "idiomati c".

template<typename T>
struct my_collection {
    template<typename... Args>
    void emplace(Args&&... args) {
        // construct the T object directly in its place out of std::forward<Args>(args)...
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...