c++ - std::function 模板参数解析

标签 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
        })
);

我还没有测试传递函数指针或函数对象,但编译器似乎很难推断出 InOut 参数,如果我没有直接传递显式 std::function 对象。

我的问题是:有没有办法解决这个问题,这样我就可以推断出可调用对象的输入/返回类型,而无需在调用站点明确提及它们?

也许在函数类型而不是输入/返回类型上对模板进行参数化?本质上,我需要推断任意可调用对象的 InOut 类型。也许是某种 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() 中实现逻辑,除非有理由键入删除函数类型。

关于c++ - std::function 模板参数解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42870490/

相关文章:

c++ - 如何使用模板模板参数专门化模板类的成员

templates - 关于 postblit 和 move 语义的问题

c++ - 模板化函数时链接器错误未找到析构函数

c++ - 在 ubuntu 机器中找不到 Boost?

c++ - 同一 (Boost) DLL 的多个版本可以在同一进程中共存吗?

c++ - 模板特化中参数包的大小

c++ - std::valarray 的 operator* 有什么问题?

c++ - MPI 中矩阵列的 scatterv 和 sendreceive

c++ - 配置gmp时出错

c++ - 与 Arduino 的串行通信仅在重启后的第一条消息上失败