我目前正在开发一个库,在该库中我正在链接函数对象。
我正在创建一个函数模板,它接受可调用对象 (目前是 std::function),并在函数的输出和输入类型上进行参数化。这里是我所定义的简化版本:
template <typename In, typename Out>
std::vector<Out> process(std::vector<In> vals, std::function< Out(In) > func)
{
// apply func for each value in vals
return result;
}
我遇到的问题与用法有关。当我传递一个lambda表达式时,编译器无法正确推断类型,因此会抱怨该函数不存在:
std::vector<string> strings;
// does NOT compile
auto chars = process(strings,
[]( std::string s ) -> char
{
return s[0]; // return first char
}
);
如果我明确地将lambda表达式包装在
std::function
中,程序就可以编译:std::vector<string> strings;
// DOES compile
auto chars = process(strings,
std::function< char(std::string) >(
[]( std::string s ) -> char
{
return s[0]; // return first char
})
);
我还没有测试过传递函数指针或函数对象,但如果我不直接传递显式的std::function对象,似乎编译器很难推断In和Out参数。我的问题是:是否有办法绕过这个问题,以便在调用处不显式地提及输入/返回类型而推断出可调用对象的输入/返回类型?也许可以将模板参数化为函数类型,而不是输入/返回类型?基本上,我需要推断任意可调用对象的In和Out类型。也许有一些auto/decltype技巧可以用于模板函数的返回类型?谢谢。
std::transform
所做的。 - Jon*out = *in++; ++out;
而不必知道value_types的值,因为它只处理迭代器。这个例子简化了很多事情-要求了解输入/返回类型。 - Alexander Kondratskiy