C_and_CPP 板


LINE

完整标题:如何强迫struct使用者在使用copy assignment时,另外对其他某值另外赋值? 开发平台(Platform): (Ex: Win10, Linux, ...) Mac 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) clang 14 额外使用到的函数库(Library Used): (Ex: OpenGL, ...) X 问题(Question): 想请问各位C/CXX先进,我有个需求就是我有一个MyUniquePtr 继承自unique_ptr,还会有 其他一般的struct包含了这个MyUniquePtr。那我在过程中我会有copy assignment的行为, 我只想要他copy那些一般的Plain Old Data,那个MyUniquePtr务必要求用的人另外对MyUni quePtr赋值。 想请问我有无办法用一些clang语法,包含preprocessing,在compile阶段就发现使用者是 否有另外对MyUniquePtr赋值?我有一些想法但不知道是否可行 给MyUniquePtr的copy assignment overload中,标记为deprecated 1. 假如使用者有MyUniquePtr赋值,那他可标记一些东西,例如#define,或是某些flag? 这样可以绕过这个deprecated(或搭配-Werror=deprecated-declarations?) 2. 假如使用者有额外赋值,他就可以用#pragma clang diagnostic ignored "-Wdeprecate d-declarations"把他那赋值的包起来来silence error,但这deprecated是在别的header, 包在这边看起来没什麽用 想请问各位有什麽其他方法可以做到吗,简单说就是如果使用者没有另外赋值,编译就报错 。如果有另外赋值,那就没事。谢谢指教 喂入的资料(Input): MyStruct s1; MyStruct s2; 1. s1 = s2; 2. s1 = s2; s1.p_char = new char(100); 预期的正确结果(Expected Output): 1. 编译失败 2. 可编译成功 错误结果(Wrong Output): 程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档) https://godbolt.org/z/3M5KveYWa 图片供手机使用者方便阅读 https://imgur.com/bXyms0J 补充说明(Supplement): 只能用到c++11 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 174.160.86.171 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1712611149.A.F90.html ※ 编辑: mmmmei (174.160.86.171 美国), 04/09/2024 05:23:33
1F:→ firejox: 这样设计的意义是什麽04/09 07:37
我是想说这样比较直觉?就是一个=比较有那种右边POD都要赋值给左边的感觉。
2F:→ firejox: 要这样做就用setXX()来取代copy assignment 就好了04/09 07:41
3F:→ firejox: copy assignment 直接delete04/09 07:42
我有想过这,但如果之後myStruct又多了数个MyUniquePtr的话,那这个setXX介面要频繁的 更改增加更多参数。所以在想有没有办法能把uniquePtr赋值的部分交给用的人来做 ※ 编辑: mmmmei (174.160.86.171 美国), 04/09/2024 09:52:30
4F:→ lycantrope: 只能copy不能move 那为何要unique_ptr04/09 13:27
我不太懂这句话意思,是指为什麽不用shared_ptr还是指不用传统指针吗? 我也不太懂只能copy不能move这个结论哪里来的,能麻烦细说一下吗?感谢 ※ 编辑: mmmmei (174.160.86.171 美国), 04/09/2024 14:43:20
5F:→ firejox: operator的语意要越明确越好,不要有做一半的04/09 15:12
6F:→ firejox: copy就copy,move就move。做一半只是变得更难维护而已04/09 15:33
嗯嗯合理,我的需求看来只是要copy POD而已,uniq_ptr不动,这样用opeator看来不恰当
7F:推 chchwy: unique_ptr 不允许 copy,因为不能有多个拥有者04/09 19:16
8F:→ chchwy: 所以你在一个允许copy的struct里面放unique_ptr04/09 19:17
9F:→ chchwy: 本身就非常违和04/09 19:17
了解了解,那这opeator看来就不该出现可用
10F:→ sarafciel: 你的设计让人困惑的点在於,所有的东西你都只要半套而04/10 00:07
11F:→ sarafciel: 已,你想要pod style,但你塞unique_ptr的那一刻他就不04/10 00:07
12F:→ sarafciel: 是pod了,你用unique_ptr却不打算按move跟ownership的04/10 00:07
13F:→ sarafciel: 规则来玩,你想要做copy assignment,但你在做的事也只 04/10 00:07
14F:→ sarafciel: 有一部分的copy,剩下来那一部分要不要copy要使用者自04/10 00:07
15F:→ sarafciel: 己去弄,老实说,这应该没有比较直觉XD 04/10 00:07
确实是都半套而已,好吧看来确实只是我一厢情愿而已,之後别人用的话应该反而觉得很不 直觉
16F:推 wulouise: 为什麽要user给值?你不能直接deep copy就好?是说如果 04/10 02:02
Emmm因为其实只想要copy其他POD,unq_ptr是会另外操作
17F:→ wulouise: 要能copy为什麽不乾脆不要用unique_ptr直接用aggregate 04/10 02:02
18F:→ wulouise: type04/10 02:02
19F:→ wulouise: 比如强迫该type一定要trivial copyable04/10 02:03
20F:→ wulouise: 我觉得继承unique_ptr这个设计也有点怪,你想要可以copy04/10 02:05
21F:→ wulouise: 的uniq_ptr用意到底是什麽...refactor旧code?04/10 02:05
其实也不是非要copy,只是希望在外面用的时候(例子里的s1=s2)时,可以直接用operato r=(我个人"觉得"看起来比较直觉啦) 感谢各位提供意见,看来我原本这想法本身是很反语言设计逻辑的,总之我的UniquePtr就 是该继续delete掉copy assignment不该使用对吧? 那现在原帖问题变成: 有什麽比较优雅的方式能够在MyStruct中,把所有trivially_copy able的POD值都复制过去?(unique_ptr会另外赋值) 因为若另外定义一个function “copyPOD()”,生怕若之後MyStruct有多新的field,会忘 记加在copyPOD里。 ※ 编辑: mmmmei (17.213.209.49 美国), 04/10/2024 04:56:37
22F:推 Dracarys: 优雅的方式:Reflection? 04/10 09:44
23F:→ Dracarys: http://wg21.link/p2996 04/10 09:44
24F:推 Dracarys: 怕之後少加field的话,可以看一下X macro pattern 04/10 09:47
嗯嗯谢谢关键字,我也有试了下确实可行(缺点只是macro又臭又长)
25F:推 wulouise: 规定所有人把放在trivially copyable的东西统统放MyStru04/10 09:59
26F:→ wulouise: ct::mPod里面,复制的时候只复制mPod 04/10 09:59
27F:→ wulouise: 很遗憾你不能阻止人乱塞但code review可以定他04/10 10:00
嗯嗯谢谢,这个看起来也符合设计逻辑,缺点只是现有那些field都要多加个.mPod.
28F:推 sarafciel: 像楼上讲的一样,你可以把pod的部分包一个struct04/10 23:34
29F:→ sarafciel: 然後这里可以考虑用继承做: 04/10 23:35
30F:→ sarafciel: https://godbolt.org/z/YvszWx644 04/10 23:36
嗯嗯谢谢,这跟aggregate看起来各有千秋,感觉就是使用时机不太同?但看起来也挺优雅 的
31F:推 wulouise: 楼上的做法不错,不过我习惯aggregate 04/11 22:08
※ 编辑: mmmmei (17.213.209.49 美国), 04/12/2024 05:07:58
32F:推 pnpncat: 你就把 operator=(const MyStruct&) 直接 delete 掉 06/07 14:22
33F:→ pnpncat: 然後做一个 operator=(const MyStruct::Src&) 来用 06/07 14:23
34F:→ pnpncat: 再定义一个 MyStruct::Src operator(特殊要求) 来用 06/07 14:24
35F:→ pnpncat: 这样 s1 = s2 会编译错误 s1 = s2(new char(100)) 会过 06/07 14:26
36F:→ pnpncat: 这类作法可以实现你的要求 但我想你还是该想想这样的设计 06/07 14:28
37F:→ pnpncat: 是否真的好用 以及是否有其必要 06/07 14:29
38F:推 OnlyRD: 感觉你对c++语意的理解有点错误,这样设计是自找麻 03/18 02:46
39F:→ OnlyRD: 烦,而且使用者会觉得跟c++的标准很不同。 03/18 02:46







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP