如何将模板lambda传递给函数并将其与不同类型一起使用

Mat*_*her 0 c++ lambda template-argument-deduction generic-lambda c++17

我使用宏从旧的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
}
Run Code Online (Sandbox Code Playgroud)

几次.fun1()具有一组不同的依赖于参数fun2()的参数类型,我可以具有arg1arg2有作为(真实代码实际上有几层ifs各自的时间与每个分支内的不同组的类型,功能几个附加层).

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

[&](auto arg) { fun1(fun2(arguments, arg));}
Run Code Online (Sandbox Code Playgroud)

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

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

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

max*_*x66 5

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

简单如下呢?

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

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

所以你可以简单地通过类的模板类型拦截lambda.

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

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

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