ホームページ >バックエンド開発 >C++ >C で STL コンテナを識別するための型特性を作成するために SFINAE をどのように使用できますか?

C で STL コンテナを識別するための型特性を作成するために SFINAE をどのように使用できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 12:00:29209ブラウズ

How can SFINAE be used to create a type trait for identifying STL containers in C  ?

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 true と評価されます。それ以外の場合は false と評価されます。

注: 型特性が STL コンテナのみを識別するようにするには、チェックを調整して STL コンテナに共通の特定の要件を確認する必要がある場合があります。

以上がC で STL コンテナを識別するための型特性を作成するために SFINAE をどのように使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。