разрешение аргументов шаблона std :: function

В настоящее время я работаю над библиотекой, в которой я объединяю функциональные объекты.

Я создаю шаблон функции, который принимает вызываемый объект (std :: function на данный момент) и параметризован для типа вывода и ввода функции. Вот упрощенная версия того, что я определяю:

template 
std::vector process(std::vector vals, std::function< Out(In) > func)
{
    // apply func for each value in vals
    return result;
}

У меня проблема в использовании. Кажется, что когда я передаю лямбду, компилятор не может правильно определить тип, поэтому жалуется, что функция нене существует:

std::vector strings;
// does NOT compile
auto chars = process(strings,
        []( std::string s ) -> char
        {
            return s[0]; // return first char
        }
);

Если я явно обернуть лямбда вstd::function, программа компилирует:

std::vector strings;
// DOES compile
auto chars = process(strings,
        std::function< char(std::string) >(
        []( std::string s ) -> char
        {
            return s[0]; // return first char
        })
);

У меня нетМы еще не проверяли передающие указатели на функции или функциональные объекты, но, похоже, компилятору будет сложно определитьIn а такжеOut параметры, если ям не передавая напрямую явноеstd::function объект.

Мой вопрос заключается в следующем: есть ли способ обойти это, чтобы я мог определить тип ввода / возврата вызываемого объекта без явного упоминания их на сайте вызова?

Возможно параметризовать шаблон на тип функции вместо типов ввода / возврата? По сути, мне нужно вывестиIn а такжеOut Тип для произвольного вызова. Возможно, какой-то /autodecltype трюк для типа возврата функции шаблона?

Спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос