Лучшая реализация отсутствующего унарного std :: copy - PullRequest
4 голосов
/ 11 сентября 2011

C ++ 11 вводит семантику, чтобы избежать ненужного копирования объектов, и std::move, чтобы применять эту семантику, когда в противном случае произойдет копирование.Однако теперь есть также некоторые случаи, когда требуется копия, но не по умолчанию.

Рассмотрим, например, эту наивную реализацию reverse.Поскольку основанный на диапазоне for использует идеальную пересылку, изменение контейнера внутри цикла приводит к повреждению.

auto out_iter = container.rbegin();
for ( auto value : container ) {
    * out_iter ++ = value;
}

Цель состоит в том, чтобы исправить это с помощью

for ( auto value : copy( container ) ) {

Это кажется простымдостаточно ... принять любой аргумент, получить базовый тип и вернуть временную копию.

1 Ответ

8 голосов
/ 11 сентября 2011

Тип возвращаемого вами значения более известен как typename std::decay<T>::type. Кроме этого, используйте std::forward в теле, чтобы воспользоваться всеми преимуществами идеальной пересылки:

template<typename T>
typename std::decay<T>::type
val(T&& t)
{ return std::forward<T>(t); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...