C++ Lambda 包装器:应该更喜欢捕获或通过参数

C++ Lambda Wrapper: Should one prefer to have arguments captured or passed?

本文关键字:参数 更喜欢 包装 Lambda C++      更新时间:2023-10-16

我正在围绕一些代码编写一个包装函数,以最大限度地提高其重用率。它看起来像下面这样:

template <class Func>
void do_work(const int *R, Func extra_work)
{
    //do some work
    int i = ...
    int j = ...
    extra_work(i,j); //Using extra_lamb_1
    //extra_work(i,j,R); //Using extra_lamb_2
}

包装器如下所示:

void work_wrapper(const int *R, int *Q)
{
    auto extra_lamb_1 = [R,Q] (int i, int j) //Captures R
    {
        //Do extra stuff
    };
    /*auto extra_lamb_2 = [Q] (int i, int j, int *R) //Passes R
    {
        //Do extra stuff
    };*/
    do_work(R,extra_lamb_1);
    //do_work(R,extra_lamb_2);
}

我的问题是,在这种情况下,extra_lamb_1是比extra_lamb_2更可取还是反之亦然?为什么?

如前所述,R没有功能差异,因为它已经在do_work中可访问。

对于Q来说会有区别,因为它不在do_work的范围内。

如果Rdo_work运算的一个组成部分,那么它绝对应该作为一个参数传递。如果没有,那么捕获R更有意义,这样它就不会弄乱do_work的范围。

相关文章: