С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
1

Recursive variadic generic lambda up to c++17

11.01.2021, 23:26. Показов 697. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решил немного поэкспериментировать с лямбдами, решая задачу конвертации переменных кортежа в дамп памяти, но шаблонные лямбды из C++20 пока не использую.
Цель сделать тоже что и в случае рекурсивно вызываемой шаблонной вариативной функции, но исключительно на лямбдах. Потому что внутри функции шаблоны запрещены(но не generic lambda), а писать внешюю шаблонну функцию громоздко.
В и тогде получилась хрень, которая не работает, но компилируется.
Лбопытно стало, а во что оно инстанцировалось, и можно ли сделать так чтоб работало.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template<std::size_t _sz, typename ...Args>
void convert_tuple_to_raw(const std::tuple<Args...>& _src,
                          std::uint8_t (&_dst)[_sz])
{
    std::size_t offset = 0;
    auto converter = [&](auto&... _args)
    {
        auto converter_rec = [&](const auto& __lamb, 
                                 const auto& __arg0, 
                                 auto&... __args)
        {
            static constexpr auto item_size = sizeof (__arg0);
            memcpy((void *)(_dst + offset), (void *)&__arg0, item_size);
            offset += sizeof (__arg0);
            if constexpr (sizeof... (__args) > 0)
            {
                __lamb(__lamb, __args...);
            }
        };
        converter_rec(converter_rec, _args...);
    };
    std::apply(converter, _src);
}
Добавлено через 6 минут
В итоге получилась хрень, которая не работает, но компилируется.
Любопытно стало, а во что оно инстанцировалось, и можно ли сделать так чтоб работало.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2021, 23:26
Ответы с готовыми решениями:

Variadic template lambda capture
Доброго всем дня! Речь пойдёт об C++14, в котором стало возможным делать прямую передачу в...

Variadic Templates - как обращаться к аргументам variadic-функции?
Всем привет! Наверное, рано мне ещё с моими скудными знаниями в это лезть, но, изучив шаблоны и...

Сконструировать \lambda-вызов и вычислить его значение Lambda
Задание Для выражения из таблицы согласно номеру варианта сконструировать \lambda - вызов и...

Variadic templates, или variadic constructor в шаблоне, или прочие извращения
Здравствуйте. Есть такое Wrapper&lt;Obj&gt; w; Wrapper - обертка над объектом того класса, который...

6
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
11.01.2021, 23:33 2
Сделал вот так:
C++
1
2
    std::uint8_t dest[sizeof(decltype(1)) + sizeof(decltype(2u)) + sizeof(decltype('a'))];
    convert_tuple_to_raw(std::make_tuple(1, 2u, 'a'), dest);
Вроде работает. Копирование произошло. И 1, и 2, и 'a' в dest я увидел.
1
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
11.01.2021, 23:53  [ТС] 3
jugu, Да, Вы правы, это отладчик показывает хрень, когда хочешь посмтреть
static constexpr auto item_size = sizeof (__arg0);
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
12.01.2021, 00:05 4
Цитата Сообщение от squareroot Посмотреть сообщение
Цель сделать тоже что и в случае рекурсивно вызываемой шаблонной вариативной функции, но исключительно на лямбдах. Потому что внутри функции шаблоны запрещены(но не generic lambda), а писать внешюю шаблонну функцию громоздко.
Если использование рекурсии - не самоцель, то проще обойтись без неё, КМК; как-нибудь так:
C++
1
2
3
4
5
6
7
8
9
10
auto const convert_tuple_element_to_raw = [&] (auto const& element) {
   std::memcpy(_dst + offset, &element, sizeof(element));
   offset += sizeof(element);
   return 0;
};
        
auto const converter = [&] (auto const& ...elements) {
   auto const dummy = { convert_tuple_element_to_raw(elements)..., 0 };
   (void)dummy;
};
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
12.01.2021, 00:17  [ТС] 5
gray_fox, Нет, как раз наоборот. Рекурсия как мне кажется наоборот нежелетельная изза того что компилятор должен по сути генерировать кучу функтуров-специализаций для каждого списка аргументов.
Но Я бы Ваш вариант немно поправил:
C++
1
volatile (void)dummy;
А то оптимизатор нечайно убьёт всё.
В вашем случае количество лямбд будет равно количеству типов в кортеже, что лучше чем у меня.
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
12.01.2021, 00:21 6
Цитата Сообщение от squareroot Посмотреть сообщение
А то оптимизатор нечайно убьёт всё.
Не должен, побочный эффект же есть (memcpy)
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
12.01.2021, 00:36  [ТС] 7
Я хрень написал.
В вашем случае количество лямбд будет равно количеству типов в кортеже, что лучше чем у меня.

Рекурсия как мне кажется наоборот нежелетельная изза того что компилятор должен по сути генерировать кучу функтуров-специализаций для каждого списка аргументов.

Там операторы вызова множаться в лямбде, а не сами лямбды.
0
12.01.2021, 00:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2021, 00:36
Помогаю со студенческими работами здесь

Спецификация generic upcast/downcast в generic типах
Почему только интерфейсы и делегаты в C# поддерживают технику ковариантности и контрвариантности в ...

Error, recursive assignment
for i to n do Steps := place(i, o, 1); Heights] := Heights]+(1/5)*n end do НЕ МОГУ ПОНЯТЬ В ЧЕМ...

Predicates for recursive functions Prolog
Доброе время суток! Я новичок в Prolog. Нам задали написать предикаты к рекурсивным функциям ...

Postgresql recursive sum + path
Добрый день. Необходима помощь в рекурсивном запросе. Есть две таблицы . create table m_unit( ...

XDelta Recursive Patch Maker
Recursive Patch Maker (RPM) - утилита предназначенная для создания бинарных патчей. С ее помощью вы...

With recursive update postgres очень сложно
У меня есть запрос, который выводит пользователей у которых дата регистрации позже даты их первого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru