看板 C_and_CPP 關於我們 聯絡資訊
小弟遇到一個問題 就是如果函數要分別 support left 和 right reference 的參數, 只能把同一段程式碼複製一遍再加 & 請問有沒有簡單使用的方式呢? 另外 member function 要實作 const this 和 this pointer access 的時候 是不是也只能寫兩遍? 是否也有簡潔的方式? 謝謝
LPH66:我寫起來的感覺是只有跟那個參數無關的程式碼能共用 10/14 20:13
LPH66:但之所以會用這種寫法大多都是為了省下那個參數的複製 10/14 20:14
LPH66:也就是說通常這兩者很難能共用 10/14 20:14
LPH66:至於後者 如果你對 this 只取不存那就寫 const 版就好 10/14 20:15
LPH66:就像一個參數你只取不存的話直接掛 const 上去是一樣的道理 10/14 20:16
applecool:所以答案是全都沒有?? 10/14 20:20
LPH66:我的答案比較偏向沒什麼必要...特別是後者我想不到 use case 10/14 20:27
applecool:是阿~~極其罕見,也只有我這種倒楣鬼會遇到 10/14 20:37
Feis:後者可能發生的情況是回傳一個指涉物件內部成員的參考 10/14 20:48
Feis:例如實作一個陣列類別時, operator[] 會有 const 跟非 const 10/14 20:48
Feis:實作內容相同但是因為回傳值的型態不同需要兩個函式 10/14 20:49
Feis:我所知的作法是寫 const 版本, 然後在非 const 版本呼叫const 10/14 20:50
Feis:版本. 呼叫時會用到 const_cast<> 10/14 20:50
Feis:至於前者我不確定你的用法~ 可能給個例子比較好說? 10/14 21:03
Feis:解法應該不脫強制轉型或模版 10/14 21:09
謝謝,不過不能用轉型阿,至於怎麼用 template 完成這需求 我暫時沒想出來 至於前者我臨時給一個例子好了 假設我要把很多變數轉字串 l-value 版本的大概程式碼或許長這樣 template<typename T> string toStr(const T &x) { stringstream buf; buf << x; return buf.str(); } template<typename T, typename... Args> string toStr(const T &x, Args... y) { string tmp( toStr(x) ); return (tmp += toStr(y...)); } 但 r-vlaue 的時候似乎只能再複製一次了(move 會影響效能嗎) P.S. code 只是例子,可能有 bug,請不要 compile 話說轉字串有沒有什麼簡單又高效的方法呢? 感恩!!!
Ebergies:其實我會在真的遇到問題的時候特製這個地方來處理... 10/14 23:00
LPH66:move 就是解決複製暫時物件後又把原來的暫時物件摧毁 10/14 23:01
LPH66:這種看起來沒什麼意義但原本不得不做的複製問題 10/14 23:02
※ 編輯: applecool 來自: 123.110.244.195 (10/14 23:03)
LPH66:如果不能 move 的話我覺得就沒有必要寫 rvalue ref 的參數了 10/14 23:03
applecool:嗯嗯我意思是說,不能寫一個版本,另一個用 move 10/14 23:04