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

时间:2014-04-02 09:00:15

标签: c++ templates c++11 lambda

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

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

template <typename R>
R foo(R (*func)())
{
    return func();
}

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

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

bool a = foo( [](){ return true; } );

我试图使用模板使它变得通用但是在调用它时会出现编译器错误(没有匹配的函数)

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

bool a = foo( [](){ return true; } );

2 个答案:

答案 0 :(得分:6)

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

template <typename F>
auto foo(F f) -> decltype(f())
{
    return f();
}

如果F需要一些参数:

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

答案 1 :(得分:4)

这是decltype的工作:

template <typename F>
auto foo(F f) -> decltype(f()) 
{
}