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

2018-09-18 10:36:20 +08:00
 zynlp
我只知道它们基本语法,
我想知道这两个运算符有什么场景是必须用到的,或者什么场景用它们会比较方便?
3207 次点击
所在节点    C
14 条回复
GeruzoniAnsasu
2018-09-18 11:32:56 +08:00
https://wiki.qt.io/New_Signal_Slot_Syntax

其实我很想翻一个 connect()的定义出来的,但居然找不到,也是醉了
想要回调一个成员函数的时候就必然要用成员函数指针,也就会用到这俩运算符
GeruzoniAnsasu
2018-09-18 11:34:51 +08:00
不过感觉更常见的写法是 bind 成一个 functor ? bind 能不能完全替代成员指针就不清楚了
MeteorCat
2018-09-18 11:54:32 +08:00
在 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
2018-09-18 12:23:11 +08:00
->*是什么意思? 像 foo->bar 这样吗?这难道不是最常见的语法吗?
innoink
2018-09-18 12:39:17 +08:00
@MeteorCat 引用做参数,并不会引起构造
zynlp
2018-09-18 12:45:03 +08:00
jedihy
2018-09-18 13:32:37 +08:00
@zynlp 谢谢,长见识了。很久没看 C++的新东西了
innoink
2018-09-18 13:39:53 +08:00
这个应该是成员函数指针
zynlp
2018-09-18 13:56:35 +08:00
@innoink 嗯,但是就是不知道这个有地方能用上
innoink
2018-09-18 14:26:07 +08:00
@zynlp 很少用
我能想到的一个例子是 std::invoke,当第一个参数是成员指针的时候会特殊对待。
neoblackcap
2018-09-18 14:39:13 +08:00
@MeteorCat
![WX20180918-143742@2x.png]( https://i.loli.net/2018/09/18/5ba09d5d4879c.png)

没看出引起额外的析构
GeruzoniAnsasu
2018-09-18 15:40:45 +08:00
来看一个好玩的例子
初衷是想猜一下 QT5 connect() 的实现,不过中途有了其它想法

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

https://gist.github.com/pnck/d92e10d778ca285407b068ead990befd
MeteorCat
2018-09-18 16:24:49 +08:00
@innoink 是的,我测试下确实这样,应该是最近忙昏头,把引用参数和拷贝构造混在一起了,看来还得得继续学习
MeteorCat
2018-09-18 16:34:53 +08:00
@neoblackcap 是的,刚测试下确实没有额外析构,最近忙昏头才把复制拷贝混在一起了,感谢指出错误

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/490355

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX