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
并返回结果-=
,*=
,/=
,%=
也都适用
特别感谢(并稍微抱怨)一位匿名阿根廷人,是他触发了这个问题。