在 Boost 庫中尋找 is_complete 模板時,很明顯 Boost.TypeTraits 中不存在這樣的模板。這引發了關於其缺失背後的基本原理以及此類模板的潛在設計的問題。
考慮以下程式碼片段:
<code class="cpp">//! Check whether type complete template<typename T> struct is_complete { static const bool value = ( sizeof(T) > 0 ); }; ... // use it in such a way BOOST_STATIC_ASSERT( boost::is_complete<T>::value );</code>
此程式碼有缺陷,因為將 sizeof 應用於不完整的類型是非法的。因此,需要尋求替代解決方案。
一種可能的方法涉及使用 SFINAE。然而,這帶來了限制,因為它通常無法在不違反單一定義規則 (ODR) 的情況下解決問題。
Alexey Malistov 提出的特定於平台的解決方案可用於MSVC,只需稍加修改:
<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>
不幸的是,__COUNTER__ 宏的使用沒有標準化,可能限制了它在不同編譯器之間的適用性。
以上是為什麼 Boost.TypeTraits 中沒有 `is_complete` 模板?的詳細內容。更多資訊請關注PHP中文網其他相關文章!