Есть ли способ сделать эту работу также для f2
?
Нет, насколько я знаю.
Вы можете увидеть общую лямбду (лямбду с одним или несколькими auto
аргументами) почти как функцию шаблона (обернутую в класс).
За исключением переноса класса, вы можете видеть
[](int a, auto b){};
почти как
template <typename T>
void foo (int a, T b)
{ };
Вы не можете вывести тип b
из лямбдыточно так же, как вы не можете вывести тип b
из foo()
: решено вызвать функцию (вывести тип из аргумента) или объяснить ее (что-то вроде foo<int>
).
Но есливы просто пишете decltype(foo)
, компилятор не может решить, какой тип T
, поэтому выдает ошибку.
В любом случае, я получаю ошибку, также компилируя
static_assert(std::is_same<GetArg<decltype(f1), 0>, int>{}, "Not the same!");
Полагаю, вынужно написать GetArg
следующим образом
using GetArg = std::tuple_element_t<I, decltype(details::getArgs(&F::operator()))>;
// ..............................................................^^^^^^^^^^^^^^
Или вы можете сохранить свой фактический GetArg
, но вызывая его с помощью +f1
static_assert(std::is_same<GetArg<decltype(+f1), 0>, int>{}, "Not the same!");
// ........................................^^^
, то есть: преобразовать лямбду вуказатель на функцию.