parameter pack capturing with forwarding
От: rg45 СССР  
Дата: 27.07.23 07:40
Оценка:
Привет всем!

Помогите, добрые люди, отстал от поезда.

В C++ есть очень полезная возможность форвардинга отдельных параметров при захвате в лямбду:

template <typename T>
auto make_foo(T&& t) {
    return [t = std::forward<T>(t)](/*...*/) { /*...*/ };
}


Нужно то же самое, только для вариадик параметр паков:

template <typename...T>
auto make_foo(T&&...t) {
    return [/* вот здесь нужен захват по значению с форвардингом */](/*...*/) { /*...*/ };
}


Искал, но не нашел. Выкручиваюсь через туплы — сначала запаковка, потом распаковка — жутко надоедливое занятие. Трудно поверить, что эту возможность выпустили из виду. Может, все-таки, что-то предусмотрено на этот случай, просто я не знаю?

P.S. Захват по ссылке не предлагать.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 27.07.2023 8:26 rg45 . Предыдущая версия . Еще …
Отредактировано 27.07.2023 7:59 rg45 . Предыдущая версия .
Re: parameter pack capturing with forwarding
От: kov_serg Россия  
Дата: 27.07.23 08:26
Оценка: 110 (4) +1
Здравствуйте, rg45, Вы писали:

R>Искал, но не нашел. Выкручиваюсь через туплы — сначала запаковка, потом распаковка — жутко надоедливое занятие. Трудно поверить, что эту возможность выпустили из виду. Может, все-таки, есть такая возможность, просто я не знаю?


C++20 так можно записать:
template <typename...T>
auto make_foo(T&&...t) {
    return [... t=std::forward<T>(t)](/*...*/) { /*...*/ };
}
Отредактировано 27.07.2023 8:28 kov_serg . Предыдущая версия .
Re[2]: parameter pack capturing with forwarding
От: rg45 СССР  
Дата: 27.07.23 08:28
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>C++20 так в можно записать:

_>
_>template <typename...T>
_>auto make_foo(T&&...t) {
_>    return [... t=std::forward<T>(t)](/*...*/) { /*...*/ };
_>}
_>


Это то, что нужно. Спасибо.
--
Справедливость выше закона. А человечность выше справедливости.
Re: parameter pack capturing with forwarding
От: reversecode google
Дата: 27.07.23 10:31
Оценка: +2 :))) :)
вот живой пример всем до чего приводит общение на форуме со шмыгами
Re[2]: parameter pack capturing with forwarding
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.07.23 16:20
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>C++20 так можно записать:

_>
_>template <typename...T>
_>auto make_foo(T&&...t) {
_>    return [... t=std::forward<T>(t)](/*...*/) { /*...*/ };
_>}
_>



Хм, сейчас я немножко Музыченко: "что это за ...?"
Маньяк Робокряк колесит по городу
Re[3]: parameter pack capturing with forwarding
От: reversecode google
Дата: 27.07.23 17:30
Оценка:
вариадики для каптур лямбда
вообще не прася Марти, это просто С++

https://stackoverflow.com/questions/47496358/c-lambdas-how-to-capture-variadic-parameter-pack-from-the-upper-scope
Re[3]: parameter pack capturing with forwarding
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 27.07.23 18:09
Оценка:
Здравствуйте, rg45, Вы писали:

R>Это то, что нужно. Спасибо.

А для чего такое можно использовать и насколько это быстро?
Sic luceat lux!
Re[4]: parameter pack capturing with forwarding
От: rg45 СССР  
Дата: 27.07.23 19:50
Оценка:
Здравствуйте, Kernan, Вы писали:

K>А для чего такое можно использовать и насколько это быстро?


Это нужно для оптимального захвата по значению в лямбдах. В одном списке фактических параметров могут одновременно присутствовать как lvalue, так и rvalue выражения. Этот подход обеспечивает при захвате перемещение для перемещаемых объетов и копирование для неперемещаемых. Особенно это актуально в тех случаях, когда во входных параметрах присутствуют объекты классов, для которых копирование запрещено, таких как std::unique_ptr, например.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 27.07.2023 19:52 rg45 . Предыдущая версия .
Re[3]: parameter pack capturing with forwarding
От: andyp  
Дата: 27.07.23 23:23
Оценка:
Здравствуйте, Marty, Вы писали:

M>Хм, сейчас я немножко Музыченко: "что это за ...?"


Fold expression. Давно ты на cppreference не заглядывал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.