C++ 更简洁的 Lambda 表达式:SHORTY(滥用?)
文章介绍了一个名为 `SHORTY` 的 C++ 库,旨在简化 Lambda 表达式的语法,使其更简洁。它提供了多种便捷的参数访问方式,如 `$0`、`$lhs`、`$a` 等,以及获取参数数量和所有参数的元组的方法。`SHORTY` 还支持捕获变量、调用函数、类型转换和创建元组等功能,并提供了赋值操作符的简化写法。该库的目标是提升 C++ 代码的可读性和编写效率。
terser (shorter) lambda == SHORTY
这个库旨在提供比 C++ 的 Lambda 表达式更简洁的语法,而不是用惰性 DSL 替代 C++。
import shorty;
using namespace shorty::literals;
// 你不再需要记住是 `std::less` 还是 `std::greater`
std::ranges::sort(subject, $lhs > $rhs);
// 仅过滤偶数
subject | std::views::filter(($i % 2) == 0);
// 压缩并转换
std::views::zip(A,B,C,D) | std::views::transform($a * $b + $c * $d);
// 调用外部函数
auto pythagorean = $<sqrt>($a * $a + $b * $b); // 或 $call<sqrt>;
pythagorean(3.0, 4.0) == 5.0;
// 类型转换
auto to_int = $<int>($0); // 或 $cast<int>;
to_int(4.3) == 4;
// 通过索引重新映射
auto indices = std::vector<int>{...};
auto mapping = indices | $(data)[$i];
accessing arguments
如果 shorty callable 仅获得一个参数,并且该参数是 tuple_like,那么它将自动解包。这同样适用于任何惰性调用。
默认情况下,可以使用 $0...$9 语法(对于前 10 个参数)或 $arg<N> 访问参数。但是你也可以使用以下特殊参数:
$lhs和$rhs用于二元 callable(将其限制为两个参数)$it用于第一个也是唯一的参数,它也与std::input_or_output_iterator兼容$a...$f用于前 6 个参数,但使用名称代替数字(不能与其他类型的参数混合使用)$x,$y,$z用于前 3 个参数(同样不能与其他类型的参数混合使用)$i,$n,$k,$in... 用于第一个也是唯一的参数(也不能混合使用)
querying arguments
$argc用于获取参数的数量,类型为size_t$args用于将所有参数作为元组获取
capturing
$(v)或$ref(v)通过引用捕获(或常量引用,具体取决于v的常量限定符)$value(v),$val(v)或$copy(v)通过复制捕获$fixed<v>或$const<v>通过 CNTTP 捕获(仅适用于结构类型)
calling functions
$<callable>(args...)或$call<callable>(args...)使用参数args调用callable$<CallableType>(args...)或$call<CallableType>(args...)使用参数args调用类型CallableType的新实例
casting
$<T>(expr)或$cast<T>(expr)将表达式结果static_cast为T
making a tuple
($a, $b, $c)- 将创建tuple<auto,auto,auto>($0, $1)- 将创建tuple<auto,auto>
assigning
$a += 2将 2 加到$a并返回结果-=,*=,/=,%=也都适用
特别感谢(并稍微抱怨)一位匿名阿根廷人,是他触发了这个问题。