Здравствуйте, Кодт, Вы писали:
К>Только в начале — вперемешку непонятно, как разруливать.
Я подумал про перетасовку. Например если только второй default = 111 то:
d(1,2);
d(1,2,3);
вывод:
1 111 2
1 2 3
по идее — реализуемо.
К>А, я протупил — у тебя в defaults перечисляются только последние, необязательные аргументы. А сколько спереди обязательных — это уже следствие из сигнатуры функции.
да, либо non-type template parameter в defaults_n (наверное количество аргументов у функтора можно вытащить через SFINAE).
EP>>Для ленивых вычислений вырисовывается отличие от обычных defaults:
EP>>Тут заимствуется и возвращается память со стэка вызывающей функции.
EP>>В случае с defaults_set — такой финт не пройдёт. "Заимствование" должен делать первый operator() который вызывается.
К>В порядке безумной идеи: а что, если к defauls::operator() в хвост подверстать необязательный аргумент какого-то специального типа, в котором и разместить все вычисленные на месте аргументы.
К>Что-то вот этакое
[...]
К>// где storage — это кортеж, чьи элементы конструируются не сразу, а во второй фазе;
К>// в роли storage<...> может пойти optional<tuple<...>>
Согласен, по идее должно взлететь