0

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

现在,问题是这是模板化的,所以我不能把它变成 a 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?

4

1 回答 1

5

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

简单如下呢?

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

我的意思是......你可以看到一个 lambda 函数几乎是一个类对象的语法糖operator()(一个模板operator()在泛型 lambda 的情况下)。

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

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

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

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

于 2019-01-08T17:03:57.533 回答