【发布时间】:2018-01-07 14:58:15
【问题描述】:
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;
}
显然这是一个过于简单化的例子,但基本前提是我对不同的变量一遍又一遍地执行相同的检查,我认为封装检查和相关出口更具可读性。不过,我知道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。我只是想知道这是否可能。
【问题讨论】:
-
有一点语法糖 - 是的,让代码难以理解。
-
不,这是不可能的。如果有某种方法可以做到这一点,那就太好了,但目前还没有
-
在想太多
std::longjmp能提供什么帮助之前,我会站在贾斯汀一边。 -
@Quentin 我更喜欢宏而不是 longjmp。但实际上,宏唯一的坏处是它不检查类型和语法。宏在您的编译过程之后生成源代码,如果正确使用宏,则没有不安全性。编写宏的方式存在缺陷,例如参数被增量运算符重用..或这些表达式周围没有父级。
-
但是,有一点语法糖...——这是“thankfully”的一种有趣的拼写方式
标签: c++ c++11 lambda macros syntactic-sugar