Удаление членности типа сигнатуры функции? (operator () lambda)

Jeff спросил: 13 июня 2018 в 10:03 в: c++

Я хотел бы иметь возможность создавать экземпляр std::function только с одним именем инкапсулированной лямбда вместо жестко закодированной подписи:

#include <functional>auto l = [](bool b){ return b ? 1 : 0; };
std::function<int(bool)> f(l);            // XXX - don't want the type hardcoded// Is something like this possible?
// using sig_t = strip_memberness<decltype(l::operator())>;
// std::function<sig_t> f(l);

Есть ли способ получить для параметра std::function<> тип int(bool) из l?

Даже если вывод параметра шаблона шаблона C ++ 17-стиля может сделать возможным этот конкретный вариант использования в будущем, я, к сожалению, ограничен GCC 6 / C ++ 14, а также хотел бы получить доступ к типу для целей, отличных от создания экземпляра шаблона .

1 ответ

Есть решение
Igor Tandetnik ответил: 13 июня 2018 в 10:15

Что-то в этих строках:

#include <functional>template <typename T>
struct MemberToFunction;template <typename R, typename T, typename ... Args>
struct MemberToFunction<R (T::*)(Args...)> {
    using type = R(Args...);
};template <typename R, typename T, typename ... Args>
struct MemberToFunction<R (T::*)(Args...) const> {
    using type = R(Args...);
};int main()
{
    auto l = [](bool b){ return b ? 1 : 0; };
    std::function<MemberToFunction<decltype(&decltype(l)::operator())>::type> f(l);
}

Демо

Дополнительное видео по вопросу: Удаление членности типа сигнатуры функции? (operator () lambda)

Lambdas in C++

Lambda Expressions & Anonymous Functions || Python Tutorial || Learn Python Programming