[問題] rvalue reference 的簡單使用方法

看板C_and_CPP (C/C++)作者 (noOneKnows)時間12年前 (2013/10/14 20:08), 編輯推噓4(4016)
留言20則, 4人參與, 最新討論串1/1
小弟遇到一個問題 就是如果函數要分別 support left 和 right reference 的參數, 只能把同一段程式碼複製一遍再加 & 請問有沒有簡單使用的方式呢? 另外 member function 要實作 const this 和 this pointer access 的時候 是不是也只能寫兩遍? 是否也有簡潔的方式? 謝謝

10/14 20:13, , 1F
我寫起來的感覺是只有跟那個參數無關的程式碼能共用
10/14 20:13, 1F

10/14 20:14, , 2F
但之所以會用這種寫法大多都是為了省下那個參數的複製
10/14 20:14, 2F

10/14 20:14, , 3F
也就是說通常這兩者很難能共用
10/14 20:14, 3F

10/14 20:15, , 4F
至於後者 如果你對 this 只取不存那就寫 const 版就好
10/14 20:15, 4F

10/14 20:16, , 5F
就像一個參數你只取不存的話直接掛 const 上去是一樣的道理
10/14 20:16, 5F

10/14 20:20, , 6F
所以答案是全都沒有??
10/14 20:20, 6F

10/14 20:27, , 7F
我的答案比較偏向沒什麼必要...特別是後者我想不到 use case
10/14 20:27, 7F

10/14 20:37, , 8F
是阿~~極其罕見,也只有我這種倒楣鬼會遇到
10/14 20:37, 8F

10/14 20:48, , 9F
後者可能發生的情況是回傳一個指涉物件內部成員的參考
10/14 20:48, 9F

10/14 20:48, , 10F
例如實作一個陣列類別時, operator[] 會有 const 跟非 const
10/14 20:48, 10F

10/14 20:49, , 11F
實作內容相同但是因為回傳值的型態不同需要兩個函式
10/14 20:49, 11F

10/14 20:50, , 12F
我所知的作法是寫 const 版本, 然後在非 const 版本呼叫const
10/14 20:50, 12F

10/14 20:50, , 13F
版本. 呼叫時會用到 const_cast<>
10/14 20:50, 13F

10/14 21:03, , 14F
至於前者我不確定你的用法~ 可能給個例子比較好說?
10/14 21:03, 14F

10/14 21:09, , 15F
解法應該不脫強制轉型或模版
10/14 21:09, 15F
謝謝,不過不能用轉型阿,至於怎麼用 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 話說轉字串有沒有什麼簡單又高效的方法呢? 感恩!!!

10/14 23:00, , 16F
其實我會在真的遇到問題的時候特製這個地方來處理...
10/14 23:00, 16F

10/14 23:01, , 17F
move 就是解決複製暫時物件後又把原來的暫時物件摧毁
10/14 23:01, 17F

10/14 23:02, , 18F
這種看起來沒什麼意義但原本不得不做的複製問題
10/14 23:02, 18F
※ 編輯: applecool 來自: 123.110.244.195 (10/14 23:03)

10/14 23:03, , 19F
如果不能 move 的話我覺得就沒有必要寫 rvalue ref 的參數了
10/14 23:03, 19F

10/14 23:04, , 20F
嗯嗯我意思是說,不能寫一個版本,另一個用 move
10/14 23:04, 20F
文章代碼(AID): #1IMzw_rT (C_and_CPP)
文章代碼(AID): #1IMzw_rT (C_and_CPP)