【问题标题】:How to pass a template lambda to a function and use it with different types如何将模板 lambda 传递给函数并将其与不同类型一起使用
【发布时间】:2019-01-08 17:00:20
【问题描述】:

我使用宏从旧 C++ 时代继承了这段代码。我目前正在替换它,并且我正处于需要考虑一些构造的地步。

通常,我有这个:

if(condition)
{
    fun1(fun2(arguments, arg1)); // let's say arg1 is a vector of doubles
}
else
{
    fun1(fun2(arguments, arg2)); // let's say arg2 is a double
}

好几次。 fun1() 有一组不同的参数,具体取决于fun2() 参数类型,我也可以有arg1arg2 (真正的代码实际上有几层ifs,每次都有不同的集合类型,每个分支内还有几个额外的函数层)。

我想把这个因素考虑到一个可以像这样采用模板 lambda 的函数中:

[&](auto arg) { fun1(fun2(arguments, arg));}

现在,问题是这是模板化的,所以我不能把它变成std::function,所以我不知道应该使用什么样的参数来创建我的函数:

void dispatch(bool condition, const std::vector<double>& arg1, double arg2, ???? lambda)
{
    if(condition)
    {
        lambda(arg1);
    }
    else
    {
        lambda(arg2);
    }
}

C++17 中有这样的选项吗?甚至是 C++20?

【问题讨论】:

  • dispatch 也设为模板有什么问题?
  • 你为什么不写fun1(fun2(arguments, {arg2}));

标签: c++ lambda c++17 template-argument-deduction generic-lambda


【解决方案1】:

现在,问题是这是模板化的,所以我不能把它变成std::function,所以我不知道我应该使用什么样的参数来创建我的函数

简单如下呢?

template <typename F>
void dispatch(bool condition, const std::vector<double>& arg1, double arg2, F lambda)

我的意思是...您可以将 lambda 函数视为具有 operator() 的类对象的语法糖(模板 operator() 在以下情况下) 一个通用的 lambda)。

所以你可以简单地通过类的模板类型来拦截一个lambda。

如果lambda 不可变,也许你可以接受它作为 const 引用 (F const &amp; lambda),以避免不必要的复制。

C++17 中有这样的选项吗?甚至是 C++20?

应该从 C++14 开始工作。 在 C++14 之前,通用 lambda 不可用(但您可以用模板 operator()s 的显式类替换它们)。

【讨论】:

  • 就是这样。不用花钱买std::function,直接拿函数对象就好了。
  • 哦,是的,就这么简单……看宏观太久显然会关闭大脑。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 2011-04-04
  • 2017-03-07
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多