чтобы значение полученное после executor.Execute сразу же проверялось и при первой удачной инициализации res мы выходили, возвращали результат
Interface { Execute(arg1, arg2, ...){...} };
A1: Interface {...};
A2: Interface {...};
...
Execute( std::tuple<A1, A2, ...> tup, arg1, arg2, ... )
{
return std::apply(
[ arg1, arg2, ... ]( auto& executor )
{
optional< int > res;
(( res = executor.Execute( arg1, arg2,... ) ), ... );
if( res )
{
return *res;
}
}
, tup );
}
Набросок: std::optional<int> res; auto try_one = [&res](auto& arg) { res = executor.Execute(arg); return res.has_value(); }; if (try_one(args) || ...) { return *res; } else { // ? } Где args - уже раскрытый пак
Обсуждают сегодня