从 lambda 内部调用函数返回

Phl*_*ous 2 c++ macros lambda syntactic-sugar c++11

Lambda 是在函数/方法中创建可重用代码而不污染父类的绝佳方式。大多数情况下,它们是 C 风格宏的功能性替代品。

然而,宏中有一点语法糖,我似乎无法用 lambda 复制,那就是从包含函数中退出的能力。例如,如果我需要在检查一系列ints的范围时返回,我可以使用宏轻松完成:

const int xmin(1), xmax(5);
#define CHECK_RANGE(x) { if((x) < xmin || (x) > xmax) return false; }

bool myFunc(int myint) {
    CHECK_RANGE(myint);
    int anotherint = myint + 2;
    CHECK_RANGE(anotherint);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

显然这是一个过于简化的例子,但基本前提是我对不同的变量一遍又一遍地执行相同的检查,我认为封装检查和相关出口更具可读性。不过,我知道宏不是很安全,尤其是当它们变得非常复杂时。但是,据我所知,尝试执行等效的 lambda 需要像这样的笨拙的额外检查:

const int xmin(1), xmax(5);
auto check_range = [&](int x) -> bool { return !(x < xmin || x > xmax); };

bool myFunc(int myint) {
    if(!check_range(myint)) return false;
    int anotherint = myint + 2;
    if(!check_range(anotherint)) return false;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用 lambda 来做到这一点?还是我错过了一些替代解决方案?

编辑:我认识到,除非采取重大预防措施,否则从宏内部返回通常是一个坏主意。我只是想知道是否有可能。

小智 5

你是对的——没有办法从 lambda 内部从调用者返回。由于可以从任意调用者内部捕获并存储 lambda 以供以后调用,因此这样做会导致不可预测的行为。

class Foo
{
    Foo(std::function<void(int)> const& callMeLater) : func(callMeLater) {}
    void CallIt(int* arr, int count)
    {
        for (index = count; index--;)
            func(count);
        // do other stuff here.
    }
    std::function<void(int)> func;
};

int main()
{
    auto find3 = [](int arr) 
    {
        if (arr == 3)
            return_from_caller; // making up syntax here.
    };

    Foo foo(find3);
};
Run Code Online (Sandbox Code Playgroud)