разрешение аргументов шаблона 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
Тип для произвольного вызова. Возможно, какой-то /auto
decltype
трюк для типа возврата функции шаблона?
Спасибо.