返回与作为参数传递的lambda表达式相同的类型

Sam*_*sen 0 c++ lambda templates c++11

我想创建一个接受函数指针和lambda表达式的函数.函数的返回类型应与函数指针/ lambda表达式的返回类型相同.

以下是一个函数的最小示例,该函数按预期工作,但仅适用于函数指针.我也可以使用模板来接受lambda表达式吗?

template <typename R>
R foo(R (*func)())
{
    return func();
}
Run Code Online (Sandbox Code Playgroud)

以下适用于函数指针和lambda表达式,但只接受bool.

bool foo(std::function<bool()> func)
{
    return func();
}

bool a = foo( [](){ return true; } );
Run Code Online (Sandbox Code Playgroud)

我尝试使用模板使它变得通用,但是当它被调用时我得到一个编译器错误(没有匹配的函数)

template <typename R>
R foo(std::function<R()> func)
{
    return func();
}

bool a = foo( [](){ return true; } );
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 6

您可以使用推导的退货类型:

template <typename F>
auto foo(F f) -> decltype(f())
{
    return f();
}
Run Code Online (Sandbox Code Playgroud)

如果F需要一些论点:

template <typename F, typename ... Args>
auto foo(F f, Args&&...args) -> decltype(f(std::forward<Args>(args)...))
{
    return f(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)