CPP_LECTS_RUS Telegram 295
Пятница, вечер. Время чилаута и развлекательного C++.

Представим у вас есть куча специализаций некоего шаблона функции foo.

template <typename T> int foo() { return 1; } 
template <> int foo<int>() { return 2; }
template <> int foo<float>() { return 4; }


И функция sumfoos которая подставляет по ним пачку типов и как-то её сворачивает. Ну скажем складывает.

template <typename ...T>
int sumfoos() { return (foo<T>() + ...); }


Вы хотели бы написать шаблон функции apply_sumfoos с вот такой сигнатурой

template <typename Tuple> auto apply_sumfoos();


Идея в том что он принимает кортеж, разворачивает его и для его содержимого вызывает sumfoos.

std::tuple<int, float, double> t;
assert(apply_sumfoos<decltype(t)>() == 7);


Можно предложить кривой и косой, уродливый как черт с рогами, но рабочий вариант с dummy-аргументом.

https://godbolt.org/z/zxY1qf9hT

Но это не наш метод. Я утверждаю что есть более красивые способы (и даже можно обойтись без сворачивания с index sequence).

Наливайте себе чаю с булочкой или пивка с орешками и подключайтесь. Попробуйте придумать как это решали бы вы, а потом смотрите в комментарии и ставьте лайки лучшим вариантам. Ну и если вашего там не будет — смело постите. Если никто не угадает мой вариант, скажу его завтра.

UPD: мой вариант вычислили за 20 минут. Горжусь своим каналом ))

UPD2: выношу из комментариев самые интересные варианты.

0. Просто уход от nullptr за счёт type_identity, но всё ещё dummy arg https://godbolt.org/z/P41eeTcfK via @PaRat07
1. Биндинг свёртки: https://godbolt.org/z/85EhzdWve совместно @savvatelegram и @xray_3d
2. Рефлексия: https://godbolt.org/z/Pdqd75nxq via @xray_3d
3. Вывод типов и deduction guides: https://godbolt.org/z/6zTT6M8zh via @redPergament
3a. Его разновидность через оператор приведения: https://godbolt.org/z/cTh1W3r3e от него же
4. Hana-style (я добавил к решению подписчика пару consteval потому что смог): https://godbolt.org/z/GxcqKnWMK via @n13625124998637487500
4a. Его очень красивая и лакончиная разновидность через decltype (я тоже добавил consteval от себя) https://godbolt.org/z/zjErr58zz via @alamat1
5. Виртуозный std::apply https://godbolt.org/z/Ydd5e86oP via @savvatelegram
5a. То же самое руками через index sequence https://godbolt.org/z/6feh3fvex via @vmishanin
6. Сохранение промежуточного адреса инстанцированной функции https://godbolt.org/z/racKGYnW1 опять @xray_3d
7. in_place_type подход https://godbolt.org/z/Gq9G9n773 via @alamat1

Ну и самый наивный вариант: https://godbolt.org/z/48jnhKz45 здесь в редакции @ePilnikoff но вообще до него многие дошли и он совпадает с моим решением.

Наивный вариант очень интересно улучшил @s_i_g_a до состояния https://godbolt.org/z/GePnj8qE1 чтобы функция принимала любой tuple-like тип вроде того же std::array. Понятно что так можно улучшить каждый из предложенных вариантов.

Итого мы с вами нашли десять нетривиальных и принципиально разных способов добиться цели. Очень круто.

#questions
🔥7195👍3🤔2🆒1💊1



tgoop.com/cpp_lects_rus/295
Create:
Last Update:

Пятница, вечер. Время чилаута и развлекательного C++.

Представим у вас есть куча специализаций некоего шаблона функции foo.

template <typename T> int foo() { return 1; } 
template <> int foo<int>() { return 2; }
template <> int foo<float>() { return 4; }


И функция sumfoos которая подставляет по ним пачку типов и как-то её сворачивает. Ну скажем складывает.

template <typename ...T>
int sumfoos() { return (foo<T>() + ...); }


Вы хотели бы написать шаблон функции apply_sumfoos с вот такой сигнатурой

template <typename Tuple> auto apply_sumfoos();


Идея в том что он принимает кортеж, разворачивает его и для его содержимого вызывает sumfoos.

std::tuple<int, float, double> t;
assert(apply_sumfoos<decltype(t)>() == 7);


Можно предложить кривой и косой, уродливый как черт с рогами, но рабочий вариант с dummy-аргументом.

https://godbolt.org/z/zxY1qf9hT

Но это не наш метод. Я утверждаю что есть более красивые способы (и даже можно обойтись без сворачивания с index sequence).

Наливайте себе чаю с булочкой или пивка с орешками и подключайтесь. Попробуйте придумать как это решали бы вы, а потом смотрите в комментарии и ставьте лайки лучшим вариантам. Ну и если вашего там не будет — смело постите. Если никто не угадает мой вариант, скажу его завтра.

UPD: мой вариант вычислили за 20 минут. Горжусь своим каналом ))

UPD2: выношу из комментариев самые интересные варианты.

0. Просто уход от nullptr за счёт type_identity, но всё ещё dummy arg https://godbolt.org/z/P41eeTcfK via @PaRat07
1. Биндинг свёртки: https://godbolt.org/z/85EhzdWve совместно @savvatelegram и @xray_3d
2. Рефлексия: https://godbolt.org/z/Pdqd75nxq via @xray_3d
3. Вывод типов и deduction guides: https://godbolt.org/z/6zTT6M8zh via @redPergament
3a. Его разновидность через оператор приведения: https://godbolt.org/z/cTh1W3r3e от него же
4. Hana-style (я добавил к решению подписчика пару consteval потому что смог): https://godbolt.org/z/GxcqKnWMK via @n13625124998637487500
4a. Его очень красивая и лакончиная разновидность через decltype (я тоже добавил consteval от себя) https://godbolt.org/z/zjErr58zz via @alamat1
5. Виртуозный std::apply https://godbolt.org/z/Ydd5e86oP via @savvatelegram
5a. То же самое руками через index sequence https://godbolt.org/z/6feh3fvex via @vmishanin
6. Сохранение промежуточного адреса инстанцированной функции https://godbolt.org/z/racKGYnW1 опять @xray_3d
7. in_place_type подход https://godbolt.org/z/Gq9G9n773 via @alamat1

Ну и самый наивный вариант: https://godbolt.org/z/48jnhKz45 здесь в редакции @ePilnikoff но вообще до него многие дошли и он совпадает с моим решением.

Наивный вариант очень интересно улучшил @s_i_g_a до состояния https://godbolt.org/z/GePnj8qE1 чтобы функция принимала любой tuple-like тип вроде того же std::array. Понятно что так можно улучшить каждый из предложенных вариантов.

Итого мы с вами нашли десять нетривиальных и принципиально разных способов добиться цели. Очень круто.

#questions

BY C++ and other lectures




Share with your friend now:
tgoop.com/cpp_lects_rus/295

View MORE
Open in Telegram


Telegram News

Date: |

Telegram message that reads: "Bear Market Screaming Therapy Group. You are only allowed to send screaming voice notes. Everything else = BAN. Text pics, videos, stickers, gif = BAN. Anything other than screaming = BAN. You think you are smart = BAN. Each account can create up to 10 public channels A few years ago, you had to use a special bot to run a poll on Telegram. Now you can easily do that yourself in two clicks. Hit the Menu icon and select “Create Poll.” Write your question and add up to 10 options. Running polls is a powerful strategy for getting feedback from your audience. If you’re considering the possibility of modifying your channel in any way, be sure to ask your subscribers’ opinions first. Add the logo from your device. Adjust the visible area of your image. Congratulations! Now your Telegram channel has a face Click “Save”.! Commenting about the court's concerns about the spread of false information related to the elections, Minister Fachin noted Brazil is "facing circumstances that could put Brazil's democracy at risk." During the meeting, the information technology secretary at the TSE, Julio Valente, put forward a list of requests the court believes will disinformation.
from us


Telegram C++ and other lectures
FROM American