型特性の検出: is_container または is_vector の作成
C の領域では、型特性は条件付きプログラミングとコンパイルのための強力なメカニズムを提供します。時間の反省。一般的な使用例の 1 つは、異なるコンテナ タイプを区別する型特性を作成することです。
質問:
すべてに対して true と評価される型特性を作成することは可能ですか?ベクトル、セット、マップなどの一般的な STL コンテナですか?さらに、特にベクトルに当てはまる型特性を定義するにはどうすればよいでしょうか?
回答:
SFINAE を使用した STL コンテナの検出:
これを実現するには、SFINAE (置換失敗はエラーではありません) を使用して、STL コンテナーの特徴である特定のメンバー関数と型をチェックできます。以下に例を示します。
<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 コンテナーに関連付けられた共通のメンバー関数と型 (size()、begin()、end() など) の存在をチェックします。
ベクトルの検出:
より具体的な型の特性については、ベクトルに固有の追加のメンバー関数と型の存在を確認できます。例:
<code class="cpp">template<typename T, typename Enable = void> struct is_vector { static bool const value = false; }; template<typename T> struct is_vector<T, typename std::enable_if<std::is_same<T, std::vector<__>>::value>::type> { static bool const value = true; };</code>
この型特性は std::is_same を使用して、テンプレート パラメーター T が明確に std::vector であるかどうかを確認します。
結論:
SFINAE と条件付きテンプレートの特殊化を活用することで、異なるコンテナー タイプを正確に区別する型特性を作成することが可能になり、条件付きプログラミングやソフトウェア エンジニアリング タスクに貴重なコンパイル時情報を提供します。
以上が型特性は、ベクトル、セット、マップなどの STL コンテナーを区別できますか?ベクトル専用の型特性を作成するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。