如何使用模板将 lambda 转换为 std::function

新手上路,请多包涵

基本上,我想要做的是获取一个带有任意数量的任意类型参数的 lambda,并将其转换为 std::function。我尝试了以下方法,但两种方法都不起作用。

 std::function([](){});//Complains that std::function is missing template parameters
template <typename T> void foo(function<T> f){}
foo([](){});//Complains that it cannot find a matching candidate

但是,以下代码确实有效,但这不是我想要的,因为它需要明确说明不适用于通用代码的模板参数。

 std::function<void()>([](){});

我整个晚上都在玩弄函数和模板,我只是想不通,所以任何帮助都将不胜感激。

正如评论中提到的,我试图这样做的原因是因为我试图使用可变参数模板在 C++ 中实现柯里化。不幸的是,这在使用 lambdas 时非常失败。例如,我可以使用函数指针传递标准函数。

 template <typename R, typename...A>
void foo(R (*f)(A...)) {}
void bar() {}
int main() {
    foo(bar);
}

但是,我不知道如何将 lambda 传递给这样的可变参数函数。为什么我对将通用 lambda 转换为 std::function 感兴趣是因为我可以执行以下操作,但最终需要我将模板参数显式声明为 std::function ,这是我试图避免的。

 template <typename R, typename...A>
void foo(std::function<R(A...)>) {}
int main() {
    foo(std::function<void()>([](){}));
}

原文由 retep998 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

如果不显式指定模板参数 T ,则不能将 lambda 函数对象作为 std::function<T> 类型的参数传递。模板类型推导尝试将您的 lambda 函数的类型与 std::function<T> 相匹配,在这种情况下它无法做到 - 这些类型不一样。模板类型推导不考虑类型之间的转换。

如果您可以给它一些其他方式来推断类型,这是可能的。您可以通过将函数参数包装在 identity 类型中来做到这一点,这样它在尝试将 lambda 匹配到 std::function 时不会失败(因为依赖类型只是被类型推导忽略) 并给出其他一些论点。

 template <typename T>
struct identity
{
  typedef T type;
};

template <typename... T>
void func(typename identity<std::function<void(T...)>>::type f, T... values) {
  f(values...);
}

int main() {
  func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8);
  return 0;
}

这显然在您的情况下没有用,因为您不想在以后传递值。

由于您不想指定模板参数,也不想传递可以从中推断出模板参数的其他参数,因此编译器将无法推断您的 std::function 参数的类型.

原文由 Joseph Mansfield 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用具有显式模板参数列表(C++20 特性)的 lambda 表达式,您可以更轻松地编写函数,如下所示:

 template <typename F,typename... T>
auto func(F f, T... values) {
    return f(values...);
}
int main() {
    auto result = func([]<typename... T>(T...args){
            return (...*args);
    },1,2,3,6,22);

    std::cout<<result<<"\n";
}

原文由 Saeed Masoomi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题