提问者:小点点

C++lambda作为模板函数中的std::函数


假设我们有我的代码的简化版本:

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


共1个答案

匿名用户

那么简单的如下呢?

template <typename F>
auto Context::executeTransient (F const & commands) {
    ...
    auto result = commands(commandBuffer);
    ...
    return result;
}

这样,您的方法既接受标准函数又接受lambda(从性能的角度来看(据我所知),没有将它们转换为标准函数,这是最好的),并且返回类型是从使用(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;
}

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++lambda|模板|函数|中|std|函数)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?