Здравствуйте, Evgeny.Panasyuk, Вы писали:
К>>// где storage — это кортеж, чьи элементы конструируются не сразу, а во второй фазе;
К>>// в роли storage<...> может пойти optional<tuple<...>>
EP>Согласен, по идее должно взлететь
Для полного взлёта можно не optional<tuple<...>>, а даже optional<A1>, optional<A2>, etc.
Data& operator() (
optional<int> a1 = none,
optional<Data> a2 = none
) const
{
if(!a1) a1 = make_arg1();
if(!a2) a2 = make_arg2();
return fun(*a1, *a2);
}
Так красивее, но мы часть работы в рантайм затаскиваем.
Только там со ссылками будет зарубка... может быть, не optional<Data>, а variant<none_t,Data,Data&> ? Ну в общем, стоит покумекать.