- 主题:C++ 的很多奇葩的设计都是因为回调函数而来的
从回调函数出发,搞了 std::function<>, constexpr, auto, concept 等用于描述函数的特征。还有各种泛型编程的,都是为了代替虚函数,而虚函数本身又是回调函数的一种抽象。
所以回调真是万恶之源。如果没有回调,早点发明 co_await() 说不定就没有后面这么多事情了。
--
FROM 59.61.198.*
如果只有值的话,const 就够了,出现 constexpr 就是现代 c++ 里面一大堆 lambda, c++ 自己不知道这些函数能够在编译期计算出来。所以需要程序员在代码里面给点提示。
auto 也是因为很多 lambda 的类型已经不是程序员可以写出来的,要么是太长了,要么是跟着泛型编程传入的参数而变化,所以只好用 auto 让编译器自动推断。
泛型编程当年也是毒瘤。要是早点有 any,或者有 object 基类,学 Java 把 int 打包到 Integer 里面后面就不会发明这么多语法了。更不会出现 concept 这么复杂的东西。
最近我 c++ 协程用多了,发现有了协程,c++ 真的没必要搞以前那么复杂。因为已经完全不需要用回调函数了,很多功能,甚至 shared_ptr<> 的使用都大为减少。
【 在 DoorWay 的大作中提到: 】
: 感觉你知识学杂了。
: std::function还沾点边。解决函数是first class的问题
: constexpr重点是编译期计算吧,减少运行期开销。
: ...................
--
修改:hgoldfish FROM 59.61.198.*
FROM 59.61.198.*
没错没错。。这里就是锁的使用场景。但这个复杂度不是协程带来的,而是并发带来的。
只要你想搞并发,又要访问同一个变量。那总要用点啥机制处理。
我自己一般不加锁,而是借用 QtCore 的 Copy On Write:
for (const QString &ele: QStringList(container)) {
doSomethingSync();
}
在这里,Qt 并不会真的复制。只有另外一个协程修改了 container 的时候才会复制一次。适合读多写少的场景。写多的就没办法,加协程锁吧。协程锁也是非常轻量的。
【 在 Algoquant 的大作中提到: 】
: 协程的临界区很麻烦。比如需要序列处理 容器里的使用元素:
: for auto& ele : container {
: co_await myfunction(ele);
: ...................
--
FROM 59.61.199.*
问题是回调加状态机呢?
回调套无穷层次的回调。看代码的人太难受了。
【 在 hyperLee 的大作中提到: 】
: 回调很简单很好的思路啊,搞不懂怎么这么多人说难以理解,影响思维,这不就跟我炒菜的时候去取一勺盐的一样吗?
: 反正我只管取一勺盐,外边的人得给我把盐准备好
: #发自zSMTH@么么哒
: ...................
--
FROM 27.152.129.*
回调比虚函数好啊。能够解耦。
但回调也确实复杂。
搞得编程语言也变得越来越复杂。
【 在 eematlab 的大作中提到: 】
: 我写库的话, 要给最终客户留接口, 两种方法:
: - 回调
: - 继承, 定义一些纯虚函数, 如pre-send, post-send
: ...................
--
FROM 183.253.146.*