Ein Typmerkmal ist ein leistungsstarkes Werkzeug in C, das die Eigenschaften eines Typs zur Kompilierzeit auswertet . In dieser Frage wollen wir ein Typmerkmal (is_vector oder is_container) erstellen, das verschiedene gängige STL-Containertypen unterscheidet.
Die bereitgestellte Implementierung für is_vector stößt dabei auf einen Fehler Verwenden Sie nicht den Vorlagenparameter U. Um dies zu beheben, finden Sie hier eine überarbeitete Version:
<code class="cpp">template<class T> struct is_vector { static bool const value = false; }; template<class U> struct is_vector<std::vector<U>> { static bool const value = true; };</code>
In Erweiterung des is_vector-Konzepts können wir ein generisches is_container-Merkmal erstellen, das verschiedene identifiziert STL-Containertypen:
<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, decltype(std::declval<T>().size()), decltype(std::declval<T>().begin()), decltype(std::declval<T>().end()) >, void > > : public std::true_type {};</code>
Diese verbesserte is_container-Eigenschaft kann angepasst werden, um nach zusätzlichen Container-spezifischen Merkmalen zu suchen, oder auf nur STL-Container beschränkt werden, indem das Vorhandensein bestimmter Mitgliedsfunktionen und -typen überprüft wird.
Das obige ist der detaillierte Inhalt vonWie erkennt man STL-Container mithilfe von Typmerkmalen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!