[问题] 如何强迫struct使用者另外额外赋值?

楼主: mmmmei (mmm煤)   2024-04-09 05:19:05
完整标题:如何强迫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
作者: firejox (Tangent)   2024-04-09 07:37:00
这样设计的意义是什么要这样做就用setXX()来取代copy assignment 就好了copy assignment 直接delete
作者: lycantrope (阿宽)   2024-04-09 13:27:00
只能copy不能move 那为何要unique_ptr
作者: firejox (Tangent)   2024-04-09 15:12:00
operator的语意要越明确越好,不要有做一半的copy就copy,move就move。做一半只是变得更难维护而已
作者: chchwy (mat)   2024-04-09 19:16:00
unique_ptr 不允许 copy,因为不能有多个拥有者所以你在一个允许copy的struct里面放unique_ptr本身就非常违和
作者: sarafciel (Cattuz)   2024-04-10 00:07:00
你的设计让人困惑的点在于,所有的东西你都只要半套而已,你想要pod style,但你塞unique_ptr的那一刻他就不是pod了,你用unique_ptr却不打算按move跟ownership的规则来玩,你想要做copy assignment,但你在做的事也只有一部分的copy,剩下来那一部分要不要copy要使用者自己去弄,老实说,这应该没有比较直觉XD
作者: wulouise (在线上!=在电脑前)   2024-04-10 02:02:00
为什么要user给值?你不能直接deep copy就好?是说如果要能copy为什么不干脆不要用unique_ptr直接用aggregatetype比如强迫该type一定要trivial copyable我觉得继承unique_ptr这个设计也有点怪,你想要可以copy的uniq_ptr用意到底是什么...refactor旧code?
作者: Dracarys (MayShowGunMore)   2024-04-10 09:44:00
优雅的方式:Reflection?http://wg21.link/p2996怕之后少加field的话,可以看一下X macro pattern
作者: wulouise (在线上!=在电脑前)   2024-04-10 09:59:00
规定所有人把放在trivially copyable的东西统统放MyStruct::mPod里面,复制的时候只复制mPod很遗憾你不能阻止人乱塞但code review可以定他
作者: sarafciel (Cattuz)   2024-04-10 23:34:00
像楼上讲的一样,你可以把pod的部分包一个struct然后这里可以考虑用继承做:https://godbolt.org/z/YvszWx644
作者: wulouise (在线上!=在电脑前)   2024-04-11 22:08:00
楼上的做法不错,不过我习惯aggregate

Links booklink

Contact Us: admin [ a t ] ucptt.com