看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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)
azureblaze:std::is_pod? 10/22 21:58
Feis:叫做 do 也蠻酷的~ 10/22 22:03
applecool:大感謝~~!瞬間解決!!! 10/22 22:03
suhorng:不過 C++11 union可以放不是POD的東西的樣子 10/22 22:45
Feis:要放非 POD 的前提是要手動定義 union 建構式 10/22 23:10
Feis:不過這裡 union 沒有真的定義變數, 所以沒差. 10/22 23:11
Feis:用 union 也許可以這樣寫? http://ideone.com/HlBvDq 10/22 23:26
applecool:3q~~不過現在 is_pod 跟 union 可能結果不一樣, 10/22 23:32
applecool:看來我以後只能固定用 is_pod 了 10/22 23:32
Feis:有點想知道什麼時候不一樣? is_pod:http://ideone.com/FeTBqK 10/22 23:34
applecool:就像四樓說的 10/22 23:35
Feis:但是你的用法不違背. 你的 union 沒自定義建構式 10/22 23:36
Feis:所以應該是不能是 POD 的. 當然可能是我理解有錯~很少用 10/22 23:36
applecool:union 的限制有變化之後,看來真的只能用 static_assert 10/22 23:38
applecool:再搭配 std::is_pod 使用了 10/22 23:38
applecool:所以以前用 union 判斷 POD 的習慣只能改掉了 10/22 23:39
Feis:我上一句語意怪怪的. 總之我覺得 union 還是可以. 10/22 23:40
Feis:只是 is_pod 顯然合理多了. 10/22 23:41
在我的電腦上,就像我之前貼的連結範例 struct A { int x; private: int y; }; 用 union 會過,可是他不是 POD,所以我還是會用 is_pod 不然怕編譯器最佳化開下去會炸掉 感謝各位指導!!! ※ 編輯: applecool 來自: 123.241.67.33 (10/22 23:44)
Feis:原來如此, 我沒想到這個 case~ 10/22 23:48
applecool:以前很大量地使用 constraint 說~~現在不能用了 QQ 10/22 23:51
Feis:不過這個 case 應該 C++03 也會錯. 10/22 23:52
applecool:是喔~ 10/22 23:54