ホームページ  >  記事  >  バックエンド開発  >  C テンプレートのメンバー関数を部分的に特殊化できますか?

C テンプレートのメンバー関数を部分的に特殊化できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-06 18:26:02791ブラウズ

Can You Partially Specialize Member Functions in C   Templates?

テンプレート メンバー関数の部分的な特殊化

C では、テンプレート クラスの個々のメンバーを部分的に特殊化することはできません。テンプレートの特殊化では、すべてのテンプレート パラメーターを指定する必要があります。

たとえば、次のコードは無効です。

<code class="cpp">template <typename T>
struct X
{
    void Specialized();
};

template <typename T> // Only specializes for bool type
void X<T>::Specialized()
{
    ...
}

template <typename T> // Only specializes for float type
void X<T>::Specialized()
{
    ...
}</code>

回避策

いくつかの回避策があります。目的の動作を実現するには:

  • 明示的な特殊化:
    テンプレート引数の目的の組み合わせごとに、テンプレート クラス全体を明示的に特殊化できます。例:

    <code class="cpp">template <>
    void X<int, true>::Specialized()
    {
        ...
    }
    
    template <>
    void X<float, false>::Specialized()
    {
        ...
    }</code>
  • オーバーロードされた関数:
    テンプレート クラス内で同じ名前のオーバーロードされた関数を定義し、テンプレート引数を使用して区別できます。彼ら。例:

    <code class="cpp">template <typename T>
    struct X
    {
        void Specialized(bool b)
        {
            SpecializedImpl(i2t<b>());
        }
    
    private:
        void SpecializedImpl(i2t<true>)
        {
            ...
        }
    
        void SpecializedImpl(i2t<false>)
        {
            ...
        }
    };</code>

    オーバーロードされた関数にブール値を渡すことで、その特定のメンバー関数の部分的な特殊化を実現できます。

  • パラメーター化されたテンプレート:
    別のテンプレート クラスを定義して、テンプレート パラメーターに基づいて目的の動作を実装できます。例:

    <code class="cpp">template <typename T, bool B>
    struct SpecializedImpl
    {
        static void call()
        {
            ...
        }
    };
    
    template <typename T>
    struct X
    {
        void Specialized()
        {
            SpecializedImpl<T, B>::call();
        }
    };</code>

    SpecializedImpl テンプレートは T と B の両方でパラメーター化されており、これらのパラメーターの特定の値に基づいて特殊化できます。

選択どの回避策を使用するかは、コードの特定の要件と開発者の設定によって異なります。

以上がC テンプレートのメンバー関数を部分的に特殊化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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