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

->*和.*有什么实际应用场景吗?

  •  
  •   zynlp · 2018-09-18 10:36:20 +08:00 via iPhone · 3042 次点击
    这是一个创建于 2037 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我只知道它们基本语法,
    我想知道这两个运算符有什么场景是必须用到的,或者什么场景用它们会比较方便?
    14 条回复    2018-09-18 16:34:53 +08:00
    GeruzoniAnsasu
        1
    GeruzoniAnsasu  
       2018-09-18 11:32:56 +08:00
    https://wiki.qt.io/New_Signal_Slot_Syntax

    其实我很想翻一个 connect()的定义出来的,但居然找不到,也是醉了
    想要回调一个成员函数的时候就必然要用成员函数指针,也就会用到这俩运算符
    GeruzoniAnsasu
        2
    GeruzoniAnsasu  
       2018-09-18 11:34:51 +08:00
    不过感觉更常见的写法是 bind 成一个 functor ? bind 能不能完全替代成员指针就不清楚了
    MeteorCat
        3
    MeteorCat  
       2018-09-18 11:54:32 +08:00   ❤️ 1
    在 C 之中[&引用实在 C++之中才有]
    struct ctx{};
    void echo(ctx *c){
    //do something
    //这样
    c->speak();
    }

    而在 C++没有 std::move 值转义的时候
    void echo(ctx &c){//这种引用化会导致重复调用构造 /析构
    c.speak();//此时使用指针来调用的话性能更好点,防止重复构造 /析构
    }

    C++11 带有 std::move 语义之下
    void echo(ctx &&c){//std::move(ctx);将值语义变化,不再多次触发构造和析构
    c.speak();//不再需要指针来防止多次构造和析构
    }


    其实`->`|`.`取决于你开发的程序
    如果是打算开发跨 C/C++的话,需要注意 void echo(ctx &c)这种在 C 不成立,也就不能够出现传入一个 struct 之后直接`.`来调用对象;
    如果是低于 C++11 的话,也需要使用插入指针引用,使用`->`防止对象被多次构造析构;
    如果是高于等于 C++11 则直接使用 std::move 来转化对象值语义从而使用`.`来调用对象;



    -----------------------------------------------
    以上可能有很多出错,主要很多知识点都忘了所以凭印象写,具体知识点可以查看《高质量程序设计指南:C++/C 语言》第三版的 7.5 章
    jedihy
        4
    jedihy  
       2018-09-18 12:23:11 +08:00 via iPhone
    ->*是什么意思? 像 foo->bar 这样吗?这难道不是最常见的语法吗?
    innoink
        5
    innoink  
       2018-09-18 12:39:17 +08:00 via Android
    @MeteorCat 引用做参数,并不会引起构造
    zynlp
        6
    zynlp  
    OP
       2018-09-18 12:45:03 +08:00 via iPhone
    jedihy
        7
    jedihy  
       2018-09-18 13:32:37 +08:00
    @zynlp 谢谢,长见识了。很久没看 C++的新东西了
    innoink
        8
    innoink  
       2018-09-18 13:39:53 +08:00 via Android
    这个应该是成员函数指针
    zynlp
        9
    zynlp  
    OP
       2018-09-18 13:56:35 +08:00 via iPhone
    @innoink 嗯,但是就是不知道这个有地方能用上
    innoink
        10
    innoink  
       2018-09-18 14:26:07 +08:00 via Android
    @zynlp 很少用
    我能想到的一个例子是 std::invoke,当第一个参数是成员指针的时候会特殊对待。
    neoblackcap
        11
    neoblackcap  
       2018-09-18 14:39:13 +08:00
    GeruzoniAnsasu
        12
    GeruzoniAnsasu  
       2018-09-18 15:40:45 +08:00
    来看一个好玩的例子
    初衷是想猜一下 QT5 connect() 的实现,不过中途有了其它想法

    用成员指针可以一路记录下每个调用链,直到调用触发函数的时候才一并一起调用

    https://gist.github.com/pnck/d92e10d778ca285407b068ead990befd
    MeteorCat
        13
    MeteorCat  
       2018-09-18 16:24:49 +08:00 via Android
    @innoink 是的,我测试下确实这样,应该是最近忙昏头,把引用参数和拷贝构造混在一起了,看来还得得继续学习
    MeteorCat
        14
    MeteorCat  
       2018-09-18 16:34:53 +08:00 via Android
    @neoblackcap 是的,刚测试下确实没有额外析构,最近忙昏头才把复制拷贝混在一起了,感谢指出错误
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4510 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:11 · PVG 18:11 · LAX 03:11 · JFK 06:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.