- 主题:c++太复杂了,我承认这几行代码我一辈子写不出来
感谢ai
现在rust也不是啥晦涩难懂的了,因为ai能把rust代码或者语法用无数个例子讲得很透彻
【 在 buildtolast (buildtolast) 的大作中提到: 】
: 说到晦涩难懂,rust说第二,没人敢说第一,当然,rust程序员能力都不差。
:
:
: 【 在 z16166 的大作中提到: 】
--
FROM 220.205.233.*
似乎重点跑到“精简”上了
我觉得楼主贴的那段代码是既精简,又容易看懂(没有任何要炫耀的意思,先声明一下,免得再往这个方向去了)
说难看懂的版友,我估计是C++的知识还停留在C++98或者pure C时代的。
【 在 jowoody 的大作中提到: 】
: 该精简的精简,才是好的设计。片面的精简,减少代码量有什么意义?所有变量用a b c d e 替换也是精简。
:
--
修改:z16166 FROM 111.199.144.*
FROM 111.199.144.*
楼主的那代码,是咋看出来在编译后不是精简的呢?
C++搞的模板这种元编程的东西,就是为了方便在编译期做各种运算/推导/匹配/优化。
当然,Rust等采用了别的元编程技法。
哪种元编程方法更好,可以尽情argue。但是C++的模板这种,一时半会儿甚至长期都是改不了了。
【 在 god4 的大作中提到: 】
: 高级语言精简毫无必要,要看编译后的。举个简单例子你用pBuffer和pB做变量名编译后都是一个指针,显然前者更有可读性,对比起装b耍酷,显然对于团队合作非常重要。
:
--
FROM 111.199.144.*
不如把2030改成3030,那样更不用学啥东西了,躺平就能当亿万富翁了
而且你的另一个说法也不对,俗云“工欲善其事必先利其器”,你要上阵杀敌,不把自己手里的枪pao的原理和实操搞得滚瓜烂熟?那不等于是去送人头吗
而且楼上有一位还在说C++要大力做好各种工具呢
还有个先入为主的假定是:C++搞语言改进是“shi上雕花”,这也是错误的认识。
那就是,你凭啥认为搞C++标准的这帮人是脱离软件开发实际来对C++语言做改变的?是你觉得你自己比他们更懂软件开发的需求和现状吗?
我举个简单例子:
C++里引入ranged-for,用来在绝大多数情况下替代从C里继承来的for循环语法,能规避多少for循环的错误?C里的那种for写法,是很容易出现边界错误、自增错误的。
还有一个简单例子,带赋值的if语句,可以在if语句内定义变量,避免要在if语句之前定义一个范围大的变量,使得变量的生效范围最小化,避免变量范围过大带来的一些问题。这也是有用的改进。
不花时间去了解、学习就乱喷,是high-ego的表现,可以赠送五个字:无知又无畏
【 在 buildtolast 的大作中提到: 】
: 要看懂已经很不容易了,要写出/修改/维护,简直是不可能。。。
: 语言是拿来用的工具,在工具本身花费太多时间,有点得不偿失,本末倒置。。。
: 现在的孩子,能用好c++,要到2030年了,那时候世界不知道是什么样子了。
: ...................
--
修改:z16166 FROM 111.199.144.*
FROM 111.199.144.*
哈哈
我再加一个观点:抛弃pure C、拥抱C++(或者Rust)!
为啥?因为C++在C的基础上做了很多有用的改进(为了规避代码bug、提高抽象能力),除了我上面说的ranged-for、带赋值的if语句,还有enum class替代enum、模板函数替换macro等等,可以列出一大箩筐。
除非绝对必要(指的是某些受限环境下,比如kernel、嵌入式环境等),不要再使用pure C。
有些情况下,可以用C++/Rust来实现,然后封一套pure C的接口给C代码用。
【 在 buildtolast 的大作中提到: 】
: 看哭了
:
--
FROM 111.199.144.*
这还差个东西:任务的函数是参数可变的,并且是编译时可以检查参数是否匹配的。
加上这个feature后(恐怕java实现不了,或者会用很hack的办法来实现),你再对比一下哪个简洁点。
而且楼主那里面没有什么新的语法糖,只有巨老的using、typename。变参展开可能稍微新一点。
剩下的都是std::里的东西,有些可能是老的std里新增的
【 在 babam 的大作中提到: 】
: 不太想看这种代码。太多新的语法糖了 看不明白
: 让ai写了个java的版本 我觉得好懂点
: import java.util.concurrent.*;
: ...................
--
修改:z16166 FROM 111.199.144.*
FROM 111.199.144.*
问AI也行的
可变参数的模板。也就是模板的参数的个数是任意的。
这样,任意函数都可以作为task的实际执行函数。
【 在 wanllow 的大作中提到: 】
: 模板里的class... Args
: 这里的三点是啥意思?
--
FROM 111.199.144.*
3楼那个例子似乎是很难绕开std::make_index_sequence的
原因是:
std::array的递归拼接要用到默认构造或者std::make_index_sequence,
而std::pair<frozen::wstring, frozen::wstring>没有默认构造
【 在 ziqin 的大作中提到: 】
: c++ 20可以
: 整个标准是从无到有,从纯数学构架慢慢给各个传统函数和类添加constexpr
: 模板库是不是优雅,不要看库的代码,要看使用的时候用法。
: ...................
--
FROM 111.199.144.*
赚不到一个亿,赚个几万几十万没啥问题吧,哈哈
但是躺在那里一边刷手机一边说“熟悉现代C++太难了,我没时间”,会连一个亿的一个子儿都未必能赚到啊
【 在 Waerden 的大作中提到: 】
: 会这些能赚到一个亿吗?
:
--
FROM 111.199.144.*
C++引入变参模板就是用来解决“任意个数的参数的匹配推导”、“任意函数的匹配推导”之类问题的。
这个特性不是一开始就有的,而是后来发现没有这个东西,有一部分问题就不好抽象、描述,要用hack/猥琐的方法去实现。跟C/C++一开始没有__VA_ARGS__宏,导致写个支持任意参数的日志函数都要hack,是一样的。
而线程池的任务队列,正好就是它的使用场景之一:可以在编译期检查放到队列里的任意函数的signature。
从这个角度来说,楼主那个代码就是:C++的变参模板这个特性是用在最合适的场合,而且起到了预期的作用。
这就叫“恰如其分”,而不是“炫技”。
至于是否“晦涩”,完全看说这话的人的知识基础。
没学过对应预备知识的人,比如我,光看黎曼猜想的文字表述都觉得“晦涩”,更别提进一步的了。
【 在 ForSolitude 的大作中提到: 】
: 工具发明出来,是为了在必需的时候用,而不是说能用尽量用。
: 比如人类发明了枪,但是枪的使用是被严格限制的。你不服气,说不应该限制,因为去公园玩,常常看到有人带着狗,我怕狗,我要是身上有把枪就不怕了。别人反驳你说,你怕狗也不一定要配枪啊,棍子、刀子、或者远离狗都行。你说不行,那些都不如枪好使。
: 如果限定场景:你和狗对抗,手持什么武器,你会最舒服?毫无疑问,枪最好。
: ...................
--
FROM 111.199.144.*