我有使用宏从旧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(真正的代码实际上有多层if层,每次都有不同的集类型,每个分支内还有几层其他功能)。

我想在可以采用如下模板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?

最佳答案

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


如下简单呢?

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


我的意思是...您可以看到lambda函数几乎是operator()类对象的语法糖(如果是operator(),则是模板F const & lambda
通用lambda)。

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

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


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


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

10-08 05:36
查看更多