Size: a a a

2020 October 15

ПК

Побитый Кирпич... in pro.cxx
А, дак чё тогда не устраивает с optional?
источник

АК

Александр Караев... in pro.cxx
ну это всё-таки костыль - я хочу return значения сразу, а не через промежуточный буфер.
если решения не найдётся, останусь на optional'е
источник

АК

Александр Караев... in pro.cxx
к тому же, такое решение может вынудить компилятор ходить по всему паку, даже если предикат сработает на первом элементе (вопрос в оптимизаторе)

ну а решение с рекурсией - это рекурсия
источник

АР

Андрей Руссков... in pro.cxx
const Ts* t = nullptr;
((t = &arg, Predicate(t)) || ...);
return foo(*t);
источник

АК

Александр Караев... in pro.cxx
Андрей Руссков
const Ts* t = nullptr;
((t = &arg, Predicate(t)) || ...);
return foo(*t);
Ts разных типов, но это навело на мысль..
источник

АР

Андрей Руссков... in pro.cxx
ну через void* можно, ток еще на nullptr проверь ага
источник

АК

Александр Караев... in pro.cxx
через void потеряется тип при передаче в foo
источник

АР

Андрей Руссков... in pro.cxx
а, не, не прокатит (
источник

АК

Александр Караев... in pro.cxx
std::variant<Ts*...> arg;
(..ищем arg..)
return std::visit([](const auto* arg) { return F(*arg); }, arg)
источник

Е

Егор in pro.cxx
Александр Караев
std::variant<Ts*...> arg;
(..ищем arg..)
return std::visit([](const auto* arg) { return F(*arg); }, arg)
monostate еще всунуть наверное
источник

Е

Егор in pro.cxx
а, там указатели
источник

АК

Александр Караев... in pro.cxx
Андрей Руссков
const Ts* t = nullptr;
((t = &arg, Predicate(t)) || ...);
return foo(*t);
это интересное решение, но с optional всё же проще получается
источник

АР

Андрей Руссков... in pro.cxx
ну идея же наверно еще и решение которое максимально гарантированно оптимизируется
источник

АК

Александр Караев... in pro.cxx
Андрей Руссков
ну идея же наверно еще и решение которое максимально гарантированно оптимизируется
variant отвратительно оптимизируется
источник

АР

Андрей Руссков... in pro.cxx
а, погоди

((Predicate(arg) ? (res = foo(arg), true) : false) || ...);
return res;
источник

АК

Александр Караев... in pro.cxx
Андрей Руссков
а, погоди

((Predicate(arg) ? (res = foo(arg), true) : false) || ...);
return res;
res - это optional? :)
или default constructible?
источник

АР

Андрей Руссков... in pro.cxx
ну тут да, надо будет optional
источник

АР

Андрей Руссков... in pro.cxx
RVO убьет (
источник

АК

Александр Караев... in pro.cxx
Андрей Руссков
const Ts* t = nullptr;
((t = &arg, Predicate(t)) || ...);
return foo(*t);
template <class... Ts>
constexpr auto foo3(const Ts& ...ts) {
   const void* arg = nullptr;
   std::size_t(*visitor)(const void*) = nullptr;

   ((arg = &ts, visitor = [](const void* arg) { return F(*static_cast<const Ts*>(arg)); }, Predicate(ts)) || ...);

   return visitor(arg);
}


:)

Спасибо за идею.
источник

АР

Андрей Руссков... in pro.cxx
к визитору + напиши ) И не size_t
источник