gpt4 book ai didi

c++ - 从 lambda 内部调用函数返回

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:41 25 4
gpt4 key购买 nike

Lambda 是在函数/方法内创建可重用代码而不污染父类的绝佳方式。在大多数情况下,它们是 C 样式宏的非常实用的替代品。

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

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;
}

显然这是一个过度简化的示例,但基本前提是我对不同的变量反复执行相同的检查,我认为将检查和相关导出封装起来更具可读性。不过,我知道 macros aren't very safe ,尤其是当它们变得非常复杂时。然而,据我所知,尝试执行等效的 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;
}

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

编辑:我知道 returning from inside a macro is generally a bad idea除非significant precautions are taken .我只是想知道这是否可能。

最佳答案

您是对的——无法从 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);
};

关于c++ - 从 lambda 内部调用函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45426017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com