代码之家  ›  专栏  ›  技术社区  ›  Matthieu Brucher

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

  •  0
  • Matthieu Brucher  · 技术社区  · 6 年前

    我使用宏从旧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() 参数类型,我可以 arg1 arg2 也有(真正的代码实际上有几个层 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?

    1 回复  |  直到 6 年前
        1
  •  5
  •   max66    6 年前

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

    简单地说一下怎么样?

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

    我的意思是…您可以看到lambda函数几乎是对具有 operator() (模板) 运算符() 万一 通用lambda)。

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

    也许你可以接受它作为常量参考。( F const & lambda )如果 lambda 不是可变的,以避免不必要的副本。

    在C++ 17中有这样的选项吗?还是C++ 20?

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

    推荐文章