[問題] 如何強迫struct使用者另外額外賦值?
完整標題:如何強迫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://www.ptt.cc/bbs/C_and_CPP/M.1712611149.A.F90.html
※ 編輯: mmmmei (174.160.86.171 美國), 04/09/2024 05:23:33
→
04/09 07:37,
8月前
, 1F
04/09 07:37, 1F
我是想說這樣比較直覺?就是一個=比較有那種右邊POD都要賦值給左邊的感覺。
→
04/09 07:41,
8月前
, 2F
04/09 07:41, 2F
→
04/09 07:42,
8月前
, 3F
04/09 07:42, 3F
我有想過這,但如果之後myStruct又多了數個MyUniquePtr的話,那這個setXX介面要頻繁的
更改增加更多參數。所以在想有沒有辦法能把uniquePtr賦值的部分交給用的人來做
※ 編輯: mmmmei (174.160.86.171 美國), 04/09/2024 09:52:30
→
04/09 13:27,
8月前
, 4F
04/09 13:27, 4F
我不太懂這句話意思,是指為什麼不用shared_ptr還是指不用傳統指針嗎?
我也不太懂只能copy不能move這個結論哪裡來的,能麻煩細說一下嗎?感謝
※ 編輯: mmmmei (174.160.86.171 美國), 04/09/2024 14:43:20
→
04/09 15:12,
8月前
, 5F
04/09 15:12, 5F
→
04/09 15:33,
8月前
, 6F
04/09 15:33, 6F
嗯嗯合理,我的需求看來只是要copy POD而已,uniq_ptr不動,這樣用opeator看來不恰當
推
04/09 19:16,
8月前
, 7F
04/09 19:16, 7F
→
04/09 19:17,
8月前
, 8F
04/09 19:17, 8F
→
04/09 19:17,
8月前
, 9F
04/09 19:17, 9F
了解了解,那這opeator看來就不該出現可用
→
04/10 00:07,
8月前
, 10F
04/10 00:07, 10F
→
04/10 00:07,
8月前
, 11F
04/10 00:07, 11F
→
04/10 00:07,
8月前
, 12F
04/10 00:07, 12F
→
04/10 00:07,
8月前
, 13F
04/10 00:07, 13F
→
04/10 00:07,
8月前
, 14F
04/10 00:07, 14F
→
04/10 00:07,
8月前
, 15F
04/10 00:07, 15F
確實是都半套而已,好吧看來確實只是我一廂情願而已,之後別人用的話應該反而覺得很不
直覺
推
04/10 02:02,
8月前
, 16F
04/10 02:02, 16F
Emmm因為其實只想要copy其他POD,unq_ptr是會另外操作
→
04/10 02:02,
8月前
, 17F
04/10 02:02, 17F
→
04/10 02:02,
8月前
, 18F
04/10 02:02, 18F
→
04/10 02:03,
8月前
, 19F
04/10 02:03, 19F
→
04/10 02:05,
8月前
, 20F
04/10 02:05, 20F
→
04/10 02:05,
8月前
, 21F
04/10 02:05, 21F
其實也不是非要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
推
04/10 09:44,
8月前
, 22F
04/10 09:44, 22F
→
04/10 09:44,
8月前
, 23F
04/10 09:44, 23F
推
04/10 09:47,
8月前
, 24F
04/10 09:47, 24F
嗯嗯謝謝關鍵字,我也有試了下確實可行(缺點只是macro又臭又長)
推
04/10 09:59,
8月前
, 25F
04/10 09:59, 25F
→
04/10 09:59,
8月前
, 26F
04/10 09:59, 26F
→
04/10 10:00,
8月前
, 27F
04/10 10:00, 27F
嗯嗯謝謝,這個看起來也符合設計邏輯,缺點只是現有那些field都要多加個.mPod.
推
04/10 23:34,
8月前
, 28F
04/10 23:34, 28F
→
04/10 23:35,
8月前
, 29F
04/10 23:35, 29F
→
04/10 23:36,
8月前
, 30F
04/10 23:36, 30F
嗯嗯謝謝,這跟aggregate看起來各有千秋,感覺就是使用時機不太同?但看起來也挺優雅
的
推
04/11 22:08,
8月前
, 31F
04/11 22:08, 31F
※ 編輯: mmmmei (17.213.209.49 美國), 04/12/2024 05:07:58
推
06/07 14:22,
6月前
, 32F
06/07 14:22, 32F
→
06/07 14:23,
6月前
, 33F
06/07 14:23, 33F
→
06/07 14:24,
6月前
, 34F
06/07 14:24, 34F
→
06/07 14:26,
6月前
, 35F
06/07 14:26, 35F
→
06/07 14:28,
6月前
, 36F
06/07 14:28, 36F
→
06/07 14:29,
6月前
, 37F
06/07 14:29, 37F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章