我想创建一个接受函数指针和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; } );
答案 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())
{
}