tgoop.com/cpp_lects_rus/295
Create:
Last Update:
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