用於識別 STL 容器的類型特徵
在 C 中,類型特徵可用於確定給定類型的屬性。一個常見的需求是檢查一個類型是否表示一個容器,例如向量、集合或映射。
向量的自訂實作
首先,讓我們考慮專門為向量建立一個型別特徵。但是,以下嘗試無法編譯:
<code class="cpp">template<class T, typename Enable = void> struct is_vector { static bool const value = false; }; template<class T, class U> struct is_vector<T, typename boost::enable_if<boost::is_same<T, std::vector<U>> >::type> { static bool const value = true; };</code>
此程式碼產生錯誤「部分特化中未使用範本參數:U」。這是因為在部分特化中未使用模板參數 U。
基於SFINAE 的容器解決方案
更通用的方法是使用Substitution Failure Is Not創建適用於各種STL 容器的類型特徵時出現錯誤(SFINAE) 。以下是一個範例:
<code class="cpp">template<typename T, typename _ = void> struct is_container : std::false_type {}; template<typename... Ts> struct is_container_helper {}; template<typename T> struct is_container< T, std::conditional_t< false, is_container_helper< typename T::value_type, typename T::size_type, typename T::iterator, typename T::const_iterator, decltype(std::declval<T>().size()), decltype(std::declval<T>().begin()), decltype(std::declval<T>().end()), decltype(std::declval<T>().cbegin()), decltype(std::declval<T>().cend()) >, void > > : public std::true_type {};</code>
此型別特徵檢查是否存在大多數 STL 容器常見的基本成員和方法。如果所有這些成員都存在,則 is_container
注意:為了確保類型特徵僅標識 STL 容器,您可能需要調整檢查以驗證 STL 容器常見的特定要求。
以上是如何使用 SFINAE 建立類型特徵來識別 C 中的 STL 容器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!