gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:10:59 26 4
gpt4 key购买 nike

基本上,我想要做的是采用带有任意数量任意类型参数的 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++ 中实现柯里化(Currying)。不幸的是,这在使用 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()>([](){}));
}

最佳答案

您不能将 lambda 函数对象作为 std::function<T> 类型的参数传递没有明确指定模板参数 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 的类型。争论。

关于c++ - 如何使用模板将 lambda 转换为 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39956024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com