Аргумент func -- это некоторая функция для обработки значений из src, которая в тривиальном случае ничего не меняет. Но при попытке вызвать этот метод только с первым аргументом, то копилятор возвращает:
code:main.cpp:98:26: error: no matching function for call to ‘plots_t::drawfield(dimension<float>&)’
plots.drawfield(cmp.ns);
^
main.cpp:98:26: note: candidate is:
In file included from main.cpp:31:0:
plots.hpp:25:7: note: template<class T, class auto:1> void plots_t::drawfield(dimension<T>&, auto:1)
void drawfield(dimension<T>& src, auto func = [](T val){return val;});
^
plots.hpp:25:7: note: template argument deduction/substitution failed:
main.cpp:98:26: note: couldn't deduce template parameter ‘auto:1’
А какие ресурсы выступают в роли помощников первого уровня, если не секрет?
Цитата:
thambs писал: ЧЯНДТ
Пытаешься сделать автоматический вывод типа шаблонной функции для параметра, который подразумевает вывод типа из явно переданного значения. Аргументы по умолчанию не могут быть использованы для вывода типа лямбд, потому что это равнозначно выводу типа шаблонного параметра из значения шаблонного параметра по умолчанию, что не работает.
Цитата:
thambs писал: Как сделать правильно
Ну тут много вариантов, наверное.
Можно создать переменную-лямбду-по-умолчанию и юзать её как дефолтовый аргумент (с типом выведенным через decltype).
А можно тупо завернуть в std::function.
XaeroX
>Зачем тут второй шаблонный параметр F? Без него всё отлично будет работать через std function
Не срабатывает. Точнее, если сделать без второго параметра, то он не принимает лямбду.
thambs сейчас, как ты понимаешь,я скинуть ничего не могу. Попозже. Но вообще я просто взял твой не компилировавшийся шаблон из 1 поста и добавил обвёртку из std function.