V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhuyongqi9
V2EX  ›  C++

用 C++ lambda 太爽了

  •  
  •   zhuyongqi9 · 10 天前 · 4585 次点击

    写 GUI 经常碰到需要使用 callback 来描述 event 发生时的 behavior ,在 callback 函数里面不可避免的要使用到某些变量,之前不用 lambda 需要把 callback 内引用的变量都作为全局变量,现在用了 lambda 之后可以直接变量捕捉,在 class method 内也能捕获 this 指针,用起来太爽了

    53 条回复
    kera0a
        1
    kera0a  
       10 天前 via iPhone   ❤️ 7
    写 c++ 的这么惨吗?
    AllenTsui
        2
    AllenTsui  
       10 天前
    写 c++ 的这么惨吗?
    zmxnv123
        3
    zmxnv123  
       10 天前
    写 c++ 的这么惨吗?
    orionl
        4
    orionl  
       10 天前
    写 c++ 的这么惨吗?
    majiangjun
        5
    majiangjun  
       10 天前
    写 c++ 的这么惨吗?
    ouou0701
        6
    ouou0701  
       10 天前
    写 c++ 的这么惨吗?
    chunriyeqiukong
        7
    chunriyeqiukong  
       10 天前
    写 c++ 的这么惨吗?
    fgsiveoneone
        8
    fgsiveoneone  
       10 天前   ❤️ 5
    这不是 C++11 引入的吗?今夕是何年
    zhuyongqi9
        9
    zhuyongqi9  
    OP
       10 天前 via iPhone
    纯纯惨了,以前写 js 的时候从来没考虑过这种问题
    zhuyongqi9
        10
    zhuyongqi9  
    OP
       10 天前 via iPhone
    @fgsiveoneone 是的
    BBCCBB
        11
    BBCCBB  
       10 天前
    写 c++ 的这么惨吗?
    ink19
        12
    ink19  
       10 天前
    写 c++ 的这么惨吗?
    chingyat
        13
    chingyat  
       10 天前
    为啥要用全局变量?就算不用 lambda 也应该给个 void *user_data 参数吧。
    zhuyongqi9
        14
    zhuyongqi9  
    OP
       10 天前
    @chingyat 参数是指这种吗?
    void* (*f)(void *user_data);
    我想表达的意思是非函数参数的变量
    ugpu
        15
    ugpu  
       10 天前   ❤️ 1
    以前:
    callBack() { getInstance().fun_a(); xxxx; dosomething..... } //安全的 low 了点
    callBack() { global_ptr->func(); } //天杀的 天塌了 全局指针指向的对象被销毁了.

    现在: obj.CallFunc([this]() { .a++; .b--; }

    由此可见 写 C++的是真的惨.
    ugpu
        16
    ugpu  
       10 天前
    @zhuyongqi9
    尴尬的就是指针指向的对象 协同工作里都是其他模块的 崩的时候就是甩锅. 然后他说你不看文档.最后总结没有文档规范等等一系列问题.
    尤其长期维护工程 新员工进来 那叫一个惨.
    后来大家都用 全局变量 getInstance()->xxxx. 指针都给弄没了。 你说你要用 智能指针. 还是自己封装的. 结果用起来又内存泄露.
    CPP 被弃用的问题是 维护成本太高了... 业务码农还要关心技术 结构问题.成本高。 解决方案用指针和全局变量都是为了堵漏.
    zhuyongqi9
        17
    zhuyongqi9  
    OP
       10 天前 via iPhone
    @ugpu hhhhhhhh
    ugpu
        18
    ugpu  
       10 天前   ❤️ 1
    还有那种天杀的队友, 一个对象虚继承. A->b->c 析构函数也是虚函数, 他用完 销毁了 C. 别人还在用 B.
    万丈高楼轰然倒塌就是这么来的.
    要是扯设计 规范 用法 一群程序员有一群想法.
    我建议大家用 Java & Golang. CPP 真不适合团队协作. 单机王用 CPP 爽
    originals
        19
    originals  
       10 天前
    用的时候挺爽的,就是优化等级高了后,崩了找不到地方
    snylonue
        20
    snylonue  
       10 天前
    c++ 的 lambda 感觉挺啰嗦的
    zhuyongqi9
        21
    zhuyongqi9  
    OP
       10 天前   ❤️ 2
    @ugpu 兄弟说的都是肺腑之言。自己写程序和合作开发软件完全是两码事,你想遵从规范,别人不一定想,如果一个项目没有一个强有力的人管理代码规范,后果就是五花八门,什么语言都差不多。曾经见过一个 python 项目两个人开发,类似的逻辑,一个人只用 async ,一个人只用 thread ,完全头大
    hokori
        22
    hokori  
       10 天前
    还有不要直接捕获 this 指针 如果是 c++17 可以使用 std::enable_shared_from_this<T>::weak_from_this
    NessajCN
        23
    NessajCN  
       10 天前
    流下了同情的泪水
    roundgis
        24
    roundgis  
       10 天前 via Android
    @zhuyongqi9 cpp 就是用来过滤队友的
    StinkyTofus
        25
    StinkyTofus  
       10 天前
    这段话, 中文夹杂着大量的英文单词, 有点香港电视剧的味道。 却也没有什么违和感。
    shuax
        26
    shuax  
       10 天前
    小心生命期的大坑
    GeruzoniAnsasu
        27
    GeruzoniAnsasu  
       10 天前


    7 年前我问的问题,那时候那个团队才刚用上 c++11 已经很离谱了

    OP 今年还问得出这个问题我觉得我对 c++技术栈离谱程度的理解还不够
    zhuyongqi9
        28
    zhuyongqi9  
    OP
       10 天前
    @GeruzoniAnsasu 我没有问问题,这是陈述句
    kzfile
        29
    kzfile  
       10 天前   ❤️ 1
    有的人的 C++写出来像 C ,有的人写出来像 Java ,有的人写出来像 Python ,就大概能看出这些人固定代码习惯是在哪几年了
    skallz
        30
    skallz  
       10 天前
    @StinkyTofus 因为专业名词的中文翻译很多都很垃圾,不明所以,当初被定在耻辱柱上的鲁棒性就是如此,还不如英文原文容易看懂
    sir283
        31
    sir283  
       10 天前 via Android
    @kzfile 真实,好在 c++足够强大,各种写法基本能适用,虽然可能抽象一些。
    skallz
        32
    skallz  
       10 天前   ❤️ 1
    @kzfile 很正常,不要说 c++,java ,js ,python 等,很多代码写出来都能一眼看出是哪个生态的味道 233333 ,不同语言社区的主流风格区别蛮大的
    ca2oh4
        33
    ca2oh4  
       10 天前
    c++ 11 都 10 多年了。。。
    calvinHxx
        34
    calvinHxx  
       10 天前
    天翼 3G 真是太快了。
    chashao
        35
    chashao  
       10 天前
    我们游戏引擎都是-std:c++latest 来着
    yuruizhe
        36
    yuruizhe  
       10 天前
    @zhuyongqi9 py 这东西,人来写鬼来看,用在协作工程上简直不可维护,再给整个动态属性就更有意思了
    levelworm
        37
    levelworm  
       10 天前 via Android
    @ugpu 应用层不用它就是了。还是更适合系统编程。
    nikenidage1
        38
    nikenidage1  
       10 天前   ❤️ 2
    那个啥?要不你试试 C#? 得爽到 GC
    EchoWhale
        39
    EchoWhale  
       10 天前 via iPhone
    写 c++ 的这么惨吗?
    xuanbg
        40
    xuanbg  
       10 天前
    C 艹最普遍的问题是执行 delete 无效造成内存泄露,光看代码很难确定泄漏点在哪。
    xuanbg
        41
    xuanbg  
       10 天前
    @skallz 第一次看到鲁棒性这个词我真的是一头雾水,根本无法理解是个啥意思。更早的是“套接字”,也是无法理解。
    xjp
        42
    xjp  
       10 天前
    python 、js 、java 表示很赞
    bluearc
        43
    bluearc  
       10 天前
    老项目已经见过很多回调地狱了,新项目可能的话我都尽量推协程
    SHIINASAMA
        44
    SHIINASAMA  
       10 天前
    致远星战况如何,说实话看到标题就没绷住
    yfeng445
        45
    yfeng445  
       10 天前
    @StinkyTofus 因为里边都是专有名词 www
    FreeGuy
        46
    FreeGuy  
       10 天前
    C++ 基本都是被逼着走,你看人家 Delphi 在小圈子里面依然发光发热,哪那么多语法糖,爱用不用!
    daimiaopeng
        47
    daimiaopeng  
       10 天前
    都 2024 年了,你才用上 10 年前的标准?
    a764934018
        48
    a764934018  
       10 天前
    哇,你也网上冲浪啊?
    cnbatch
        49
    cnbatch  
       9 天前
    我一个月前抱怨 C++20 的支持度不佳 ( /t/1081936 ),想不到你才刚刚用上 C++11

    这么说吧,有了 lambda 只是大幅减轻了回调地狱的程度,但远未达到“爽”的地步
    nyxsonsleep
        50
    nyxsonsleep  
       7 天前
    @levelworm 系统编程也是用 C
    levelworm
        51
    levelworm  
       7 天前 via Android
    @nyxsonsleep C++还是不少的,其实 JVM 都好多。。。
    zhuyongqi9
        52
    zhuyongqi9  
    OP
       7 天前
    @levelworm 我之前一直不知道 jvm 系统编程,想了解一下,能举一个例子吗
    levelworm
        53
    levelworm  
       7 天前
    @zhuyongqi9 呃,比如 Spark ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2511 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:56 · PVG 12:56 · LAX 20:56 · JFK 23:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.