[問題] 語法請教 (關於 decltype 與判斷 POD)

看板C_and_CPP (C/C++)作者 (noOneKnows)時間12年前 (2013/10/22 21:51), 編輯推噓0(0022)
留言22則, 4人參與, 最新討論串1/1
開發平台(Platform): gcc 4.8, clang 3.3 都試過 問題(Question): 小弟有個需求,需要強制 template 傳進來的 type 使用 [] 後是 POD, 直覺採用以下方式 template<typename Obj> void do(const Obj &p) { union { decltype(p[0]) must_be_POD; }; ... } 我假設呼叫 do(std::vector<int>(1)); 應該可以通過編譯,可是卻無法,而且看起來跟 POD 沒有關係 錯誤訊息 error: expected unqualified-id 請問該怎麼寫語法才正確呢? 另外要達到此需求是否有更好的作法呢? 謝謝 ※ 編輯: applecool 來自: 123.241.67.33 (10/22 21:55)

10/22 21:58, , 1F
std::is_pod?
10/22 21:58, 1F

10/22 22:03, , 2F
叫做 do 也蠻酷的~
10/22 22:03, 2F

10/22 22:03, , 3F
大感謝~~!瞬間解決!!!
10/22 22:03, 3F

10/22 22:45, , 4F
不過 C++11 union可以放不是POD的東西的樣子
10/22 22:45, 4F

10/22 23:10, , 5F
要放非 POD 的前提是要手動定義 union 建構式
10/22 23:10, 5F

10/22 23:11, , 6F
不過這裡 union 沒有真的定義變數, 所以沒差.
10/22 23:11, 6F

10/22 23:26, , 7F
用 union 也許可以這樣寫? http://ideone.com/HlBvDq
10/22 23:26, 7F

10/22 23:32, , 8F
3q~~不過現在 is_pod 跟 union 可能結果不一樣,
10/22 23:32, 8F

10/22 23:32, , 9F
看來我以後只能固定用 is_pod 了
10/22 23:32, 9F

10/22 23:34, , 10F
有點想知道什麼時候不一樣? is_pod:http://ideone.com/FeTBqK
10/22 23:34, 10F

10/22 23:35, , 11F
就像四樓說的
10/22 23:35, 11F

10/22 23:36, , 12F
但是你的用法不違背. 你的 union 沒自定義建構式
10/22 23:36, 12F

10/22 23:36, , 13F
所以應該是不能是 POD 的. 當然可能是我理解有錯~很少用
10/22 23:36, 13F

10/22 23:38, , 14F
union 的限制有變化之後,看來真的只能用 static_assert
10/22 23:38, 14F

10/22 23:38, , 15F
再搭配 std::is_pod 使用了
10/22 23:38, 15F

10/22 23:39, , 16F
所以以前用 union 判斷 POD 的習慣只能改掉了
10/22 23:39, 16F

10/22 23:40, , 17F
我上一句語意怪怪的. 總之我覺得 union 還是可以.
10/22 23:40, 17F

10/22 23:41, , 18F
只是 is_pod 顯然合理多了.
10/22 23:41, 18F
在我的電腦上,就像我之前貼的連結範例 struct A { int x; private: int y; }; 用 union 會過,可是他不是 POD,所以我還是會用 is_pod 不然怕編譯器最佳化開下去會炸掉 感謝各位指導!!! ※ 編輯: applecool 來自: 123.241.67.33 (10/22 23:44)

10/22 23:48, , 19F
原來如此, 我沒想到這個 case~
10/22 23:48, 19F

10/22 23:51, , 20F
以前很大量地使用 constraint 說~~現在不能用了 QQ
10/22 23:51, 20F

10/22 23:52, , 21F
不過這個 case 應該 C++03 也會錯.
10/22 23:52, 21F

10/22 23:54, , 22F
是喔~
10/22 23:54, 22F
文章代碼(AID): #1IPeB-w7 (C_and_CPP)
文章代碼(AID): #1IPeB-w7 (C_and_CPP)