Ale*_*kiy 8 c++ templates c++11 std-function
我目前正在处理一个我正在链接函数对象的库.
我正在创建一个函数模板,它接受一个可调用的对象(此刻为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
        })
);
我还没有测试过传递函数指针或函数对象,但是如果我没有直接传递显式对象,编译器似乎很难推断出In和Out参数std::function.
我的问题是:有没有办法解决这个问题,以便我可以推断出可调用对象的输入/返回类型,而无需在调用站点明确提及它们?
也许参数化函数类型的模板而不是输入/返回类型?基本上我需要推断出任意可调用的In和Out类型.也许某种auto/ decltype技巧的模板函数的返回类型?
谢谢.
我认为你可以做的是创建一个中间返回类型推导函数,用于decltype确定要传递给实际函数对象的参数:
template <typename Out, typename In>
std::vector<Out> process_intern(std::vector<In> vals, std::function< Out(In) > func)
{
    // whatever
}
template <typename In, typename Func>
auto process(std::vector<In> vals, Func func) -> std::vector<decltype(func(vals[0]))>
{
    return process_intern<decltype(func(vals[0]))>(vals, func);
}
当然,process()除非有理由键入擦除函数类型,否则您可能需要考虑直接实现逻辑.
有没有办法解决这个问题,以便我可以推断出可调用对象的输入/返回类型,而无需在调用站点明确提及它们?
否.在模板参数推断中不考虑用户定义的转换.编译器必须提出In并且Out参数的类型和参数的类型必须(几乎)完全匹配,但在这种情况下它们永远不会.
也许参数化函数类型的模板而不是输入/返回类型
是的,这就是通常所做的事情(例如,查看标准库算法)
| 归档时间: | 
 | 
| 查看次数: | 3960 次 | 
| 最近记录: |