C++中|能否作为管道符传递数据?位或运算符是否支持该功能
C++中
|运算符链式传递数据的原理 这不是内置位或运算符的原生能力,是C20新增的范围库(Ranges Library)提供的运算符重载特性,属于近年新增的C标准特性。
- 内置
|运算符本来仅支持整数类型的按位或运算,但是C++允许对自定义类型重载运算符,标准库就是利用这个特性扩展了|的能力。 - 重载后的
|规则非常简单:- 左侧接收一个可迭代的范围对象(比如数组、
std::vector、std::list等任意符合范围规范的序列) - 右侧接收一个范围适配器(你示例中的
drop、take、filter都是标准库预置的范围适配器) - 运算的结果是把左侧范围输入到右侧适配器处理后,返回的新范围
- 左侧接收一个可迭代的范围对象(比如数组、
- 这种写法的优势是完全按逻辑顺序书写处理流程,可读性远高于传统的嵌套函数调用。你示例的代码等价于传统写法:
auto selection = filter(predicate, take(to - from, drop(from, data)));
不需要从最内层函数往外倒推执行顺序,代码逻辑一目了然。
- 如果你要使用这个特性,需要使用支持C++20及以上标准的编译器,编译时指定
-std=c++20(GCC/Clang)或对应MSVC编译参数即可。你也可以自己实现符合规范的范围适配器,同样可以使用|进行链式调用。
内容的提问来源于stack exchange,提问作者Matthias Schuster
相关产品推荐
相关产品推荐

