1
GeruzoniAnsasu 2018-09-18 11:32:56 +08:00
https://wiki.qt.io/New_Signal_Slot_Syntax
其实我很想翻一个 connect()的定义出来的,但居然找不到,也是醉了 想要回调一个成员函数的时候就必然要用成员函数指针,也就会用到这俩运算符 |
2
GeruzoniAnsasu 2018-09-18 11:34:51 +08:00
不过感觉更常见的写法是 bind 成一个 functor ? bind 能不能完全替代成员指针就不清楚了
|
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 章 |
4
jedihy 2018-09-18 12:23:11 +08:00 via iPhone
->*是什么意思? 像 foo->bar 这样吗?这难道不是最常见的语法吗?
|
6
zynlp OP |
8
innoink 2018-09-18 13:39:53 +08:00 via Android
这个应该是成员函数指针
|
10
innoink 2018-09-18 14:26:07 +08:00 via Android
@zynlp 很少用
我能想到的一个例子是 std::invoke,当第一个参数是成员指针的时候会特殊对待。 |
11
neoblackcap 2018-09-18 14:39:13 +08:00
|
12
GeruzoniAnsasu 2018-09-18 15:40:45 +08:00
来看一个好玩的例子
初衷是想猜一下 QT5 connect() 的实现,不过中途有了其它想法 用成员指针可以一路记录下每个调用链,直到调用触发函数的时候才一并一起调用 https://gist.github.com/pnck/d92e10d778ca285407b068ead990befd |
13
MeteorCat 2018-09-18 16:24:49 +08:00 via Android
@innoink 是的,我测试下确实这样,应该是最近忙昏头,把引用参数和拷贝构造混在一起了,看来还得得继续学习
|
14
MeteorCat 2018-09-18 16:34:53 +08:00 via Android
@neoblackcap 是的,刚测试下确实没有额外析构,最近忙昏头才把复制拷贝混在一起了,感谢指出错误
|