確定類型是否完整是程式設計的一個重要面向。雖然 Boost 函式庫提供了廣泛的 TypeTraits,但明顯缺少 is_complete 範本。本文探討了為什麼缺乏這樣的模板,並提出了採用 SFINAE 的解決方案。
定義 is_complete 模板的直接挑戰在於將 sizeof 應用於不完整的模板類型非法。此限制源於由於缺乏有效的物件大小而可能出現歧義和未定義行為。
為了解決此限制,Alexey Malistov 提出了一個平台 -利用特定於編譯器的宏的特定解決方案。他的方法依賴 __COUNTER__ 宏,該宏隨著每次宏呼叫而遞增。這允許為每種測試類型建立具有唯一虛擬參數的模板。
此解決方案的程式碼如下所示:
<code class="cpp">namespace { template<class T, int discriminator> struct is_complete { static T & getT(); static char (& pass(T))[2]; static char pass(...); static const bool value = sizeof(pass(getT()))==2; }; } #define IS_COMPLETE(X) is_complete<X,__COUNTER__>::value</code>
透過將is_complete 定義為巢狀類別範本並利用__COUNTER__ 巨集作為鑑別器,可以以特定於平台的方式檢查類型完整性。 pass 函數用作應用 sizeof 並區分完整類型和不完整類型的虛擬參數。
雖然通常使用 SFINAE(替換失敗不是錯誤)機制要根據類型屬性啟用或停用模板專門化,不能直接應用它來檢查類型完整性。原因是 is_complete 必須計算為常數,而不是型別。
Boost 庫中缺少標準 is_complete 模板是由於應用 sizeof 帶來的挑戰不完整的類型和 SFINAE 的限制。然而,特定於平台的解決方案,例如 Alexey Malistov 提出的解決方案,可以提供一種實用的方法來檢查某些環境中的類型完整性。
以上是為什麼 Boost 中沒有標準的「is_complete」模板?的詳細內容。更多資訊請關注PHP中文網其他相關文章!