Нюанс в том, что незивестен точный тип лямбды, они приходят из пользовательского кода, следовательно мне неизвестны типы и количество аргументов, которые функтор ожидает, т.е. я не могу использовать invoke_result<>. Нужно заглянуть в класс, схватить любой оператор() и вернуть тип возврата. Получилось такое:
template <typename T>
struct Return_type;
template <typename R, typename... Args>
struct Return_type<R(Args...)> {using type = R;};
template <typename R, typename Q, typename... Args>
struct Return_type<R (Q::*)(Args...)const> {using type = R;};
template <typename R, typename Q, typename... Args>
struct Return_type<R (Q::*)(Args...)> {using type = R;};
struct A{
struct V {
double operator()(int t)const {return 5;}
};
};
int main() {
auto l = [](double a, int e)mutable{return 2;};
auto l2 = [](int a){;return 2;};
Return_type<decltype(&decltype(l)::operator())>::type a;
Return_type<decltype(&decltype(l2)::operator())>::type a2;
Return_type<decltype(&A::V::operator())>::type a3;
auto l3 = [](auto b){;return 2;};
Return_type<decltype(&decltype(l3)::operator())>::type a4;
return 0;
}
И в принципе свою задачу я решил, мне этого хватит, но не знаю как (и возможно ли вообще) получить тип от лямбды, внутри которой шаблонный оператор() (тот, что auto l3). Решаема ли задача в случае с l3?