在 C 中,在不显式指定模板参数的情况下将 lambda 转换为 std::function 是一个挑战。让我们探讨一下问题及其解决方案。
理解问题
在不指定模板参数的情况下定义 std::function 时,编译器无法推断 lambda 的类型争论。这是因为 lambda 的类型取决于其参数的类型,而编译器在模板实例化时不知道这些类型。
解决方案:身份类型
为了规避这个问题,我们可以将 lambda 包装在一个标识类型中,这样在模板类型推导过程中会忽略依赖类型。下面是一个示例:
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...); }
这种方法允许我们将 lambda 传递给 func() 函数,而无需显式指定模板参数。
限制
但是,这个解决方案有局限性:
替代方法
如果 lambda 不捕获变量并且您愿意显式指定模板参数,则可以使用以下内容方法:
std::function<void()> f = [](int x, int y, int z) { std::cout << (x*y*z) << std::endl; };
这种方法比较简单,并且在编译时已知模板参数的情况下效果很好。
以上是如何在不显式指定模板参数的情况下将 Lambda 转换为 C 中的'std::function”?的详细内容。更多信息请关注PHP中文网其他相关文章!