如何将模板lambda传递给函数并将其用于不同类型

时间:2019-01-08 17:00:20

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

我使用宏从旧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
}

几次。根据{{​​1}}参数类型,fun1()有一组不同的参数,我在那里也可以有fun2()arg1(实际的代码实际上有多层{{ 1}} s,每次都有不同的类型集,每个分支内又增加了几层功能。

我想在一个可以像这样的模板lambda的函数中考虑这一点:

arg2

现在,问题在于它是模板化的,因此我无法将其转换为if,所以我不知道我应该使用哪种类型的参数来创建函数:

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

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

1 个答案:

答案 0 :(得分:5)

  

现在,问题在于它是模板化的,因此我无法将其转换为std::function,所以我不知道我应该使用哪种类型的参数来创建函数

简单如下?

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

我的意思是……对于具有operator()(如果是{{1} 通用lambda)。

因此,您可以仅通过类的模板类型来拦截lambda。

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

  

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

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