c++ - C++ lambda 作为模板函数中的 std::function
问题描述
假设我们有我的代码的这个简化版本:
template<typename R>
R Context::executeTransient(std::function<R(VkCommandBuffer)> const &commands) {
...
R result = commands(commandBuffer);
...
return result;
}
我试图将 lambda 函数作为参数传递给该函数Context::executeTransient()
,但只有当我将 lambda 显式分配给特定std::function
类型时它才有效。这有效:
std::function<int(VkCommandBuffer)> f = [](VkCommandBuffer commandBuffer) {
printf("Test execution");
return 1;
};
context.executeTransient(f);
上面的例子有效,但由于美学原因,我想实现下面的例子,不知道这是否可能:
context.executeTransient([](VkCommandBuffer commandBuffer) {
printf("Test execution");
return 1;
});
我唯一的要求是Context::executeTransient()
应该接受具有模板化返回类型的 lambda 和函数以及具有某些特定类型的输入参数,例如VkCommandBuffer
.
解决方案
简单如下呢?
template <typename F>
auto Context::executeTransient (F const & commands) {
...
auto result = commands(commandBuffer);
...
return result;
}
这样,您的方法同时接受标准函数和 lambdas(不将它们转换为标准函数,从性能的角度来看(据我所知)这是更可取的),并且返回类型是从使用 ( auto
) 推导出来的。
在你需要知道R
方法里面的类型,你可以decltype()
申请result
auto result = commands(commandBuffer);
using R = decltype(result);
如果您需要知道R
类型作为方法的模板参数,它会有点复杂,因为涉及std::declval()
并且不幸的是,添加了冗余
template <typename F,
typename R = decltype(std::declval<F const &>()(commandBuffer))>
R Context::executeTransient (F const & commands) {
...
R result = commands(commandBuffer);
...
return result;
}
推荐阅读
- mql4 - 更改 request.comment-value?
- json - 图表查询不再支持 accountEnabled 过滤器
- android - com.android.build.api.transform.TransformException:java.lang.RuntimeException:无法预先 dex
- python - Python - 动态地向函数添加变量。为什么这可能?
- javascript - 跨度在父 div 的底部
- c# - Linq选择对象的动态列表c#
- java - 当鼠标不在窗口上时,如何在不冻结的情况下为 UI 设置动画?
- asp.net-mvc - 无法加载文件或程序集“Autofac.Integration.ServiceFabric”或其依赖项之一
- php - 如何解决这个未定义的偏移量:0 错误?
- sql-server - 将行值“移动”到末尾并将其他值“移动”到 SQL Server 中的优雅且有效的方法是什么?