C++20管道运算符不好?我不信

作者: mq白cpp分类: 野生技能协会 发布时间: 2023-07-20 11:29:53 浏览:10638 次

C++20管道运算符不好?我不信

三姓家厨:
我选择 ints.iter().filter(even).map(square).for_each(|&item| print!("{} ",item));[星星眼]

刻晴不满命不改:
管道符可读性比原来函数套娃好多了。

【回复】上限高下限低,视频里的例子可读性好很多,但封面那个真看不懂。感觉跟参数数量有决定性关系
基址变址寻址:
写起来一股画框图的感觉,又或者是写Linux脚本的感觉

【回复】也就是个运算符重载,虽然实现代码很复杂,但也就仅此而已了,并非核心语言特性
【回复】回复 @mq白cpp :哦哦这样,看来得翻源码去了(逃)
Deskball桌球--:
好像dos命令那边也有这东西,不过这样写嵌套确实爽,避免了数括号数到头皮发麻

【回复】“管道”这个概念最早来自UNIX,比dos早很多,说起来这玩意的历史和C语言差不多长了
hxdhttk:
还有可以这样的: var items = from i in ints where i % 2 == 0 select i * i;

【回复】linq的可读性和便捷性无敌
爱丽-黑子:
linux中也挺常见的,至少没有无限嵌套了,其实都还可以,可读性好就行

选择公理:
更喜欢rust那种链式调用写法,c#也可以,写起来优雅简洁(不用写命名空间)。大概因为c艹不能在类外定义方法所以不可能支持吧[脱单doge]

【回复】回复 @Martinplior :这个有点难,rust 链式调用很多是接口(trait)赋能 举个例子: 导入一个字体相关的接口(trait),字符串可以直接链式操作 带颜色加粗下划线...
【回复】回复 @梅泠洛 : 要扯扩展函数,那C++确实没有,只能通过运算符重载实现类似的功能,典型的如对std::basic_ostream&的<<运算符重载。估计这也是为什么标准库选择了重载 | 运算符作为实现。
【回复】可以选择自己写一个view的包装类,或者把rust的实现抄过来。
激昂的卤蛋:
没试过,问一下,这个风格方便运行时调试吗?

【回复】咳咳,,,那,,,基本不现实,不可能,标准库范围适配器和管道运算符的实现是很复杂的
【回复】相当不方便, java那边的stream(惰性流组合)的运行时调试, 基本上是依赖专门的插件, 本质上是提前运行一遍惰性化的流组合直到消费者函数出现一口气活性化之前的操作
【回复】惰性求值本质上是把多个迭代操作表示为了在单个迭代中应用套娃函数的效果,要调试这玩意建议直接把你想调试的那个环节直接print出来就好了
ladyrick:
想法不错,就是写法有点迷惑。filter 到底接受1个参数还是两个参数?还是上面和下面的filter其实并不是同一个filter,一个重载为1个参数,另一个重载为2个参数?

【回复】习惯了就不迷惑了,从左往右看,这运算逻辑也很符合一般直觉,而不是括号()一直套
asphix:
不好的,c++编译器更难开发了,之前就有个>>的歧义问题

【回复】没歧义啊,就是分别重载 operator| 和对应的 std::views::* 函数而已,之前是 >> 和两个 > 的奇异吧,这里符号都一样就没歧义了
【回复】回复 @soul九六 :前一个,因为左结合
【回复】回复 @インマルドレラー944 :std::cout<< 1 << 2; 是输出1再输出2,还是输出1左移2的结果呢?[doge]
智熄的Fw萌新:
这个应该不是语法糖,但是用if也可以改写,看个人咯

夏尼玛大神:
那如果想给函数的第二个参数传参而非第一个呢?

jepe:
搞不了C#那种扩展方法就只能这样了不是[doge]

【回复】这玩意就一个运算符重载,笑,,,,
DOLLORR:
有些场合很好用,比如[doge] 数据 |> 加工函数 |> 加工函数 |> 加工函数

秋壳壳儿:
clang-format 格式化它会变成一坨...我想要rust那种一个functor占一行的那种[笑哭]

C++ 计算机 编程 现代C++ 代码 管道

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!