STL コンテナを識別するための型特性
C では、型特性を使用して、特定の型のプロパティを決定できます。一般的なニーズの 1 つは、型がベクター、セット、マップなどのコンテナーを表しているかどうかを確認することです。
Vector のカスタム実装
まず、次のことから始めましょう。ベクトル専用の型特性を作成することを検討してください。ただし、次の試行はコンパイルに失敗します:
<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 ベースのコンテナー用ソリューション
より一般的なアプローチは、置換失敗が発生しないことを使用することです。幅広い 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 コンテナに共通の特定の要件を確認する必要がある場合があります。
以上がC で STL コンテナを識別するための型特性を作成するために SFINAE をどのように使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。