ホームページ >バックエンド開発 >C++ >C テンプレートでメンバーの専門化を達成するにはどうすればよいですか?

C テンプレートでメンバーの専門化を達成するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 02:50:02440ブラウズ

How to achieve member specialization in C   Templates?

テンプレートのメンバーの特殊化

テンプレート クラスの特定のメンバーを部分的に特殊化することはできません。部分特殊化では、すべてのテンプレート引数を指定する必要があります。ただし、同様の機能を実現する別のアプローチもあります。

オーバーロードされた関数

回避策の 1 つは、テンプレート クラス内にオーバーロードされた関数を導入することです。これにより、特殊化されたメンバー関数と同じようにメンバー変数および関数にアクセスできます。

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

template <typename T>
void X<T, true>::Specialized() {
    // True-specialized implementation
}

template <typename T>
void X<T, false>::Specialized() {
    // False-specialized implementation
}</code>

テンプレート パラメーターを使用した関数のオーバーロード

別のオプションは、特殊化パラメーターを次のように渡すことです。でラップされたテンプレート パラメータを使用した追加の関数引数struct.

<code class="cpp">template <typename T, bool B>
struct X {
    void Specialized() { SpecializedImpl(i2t<B>()); }

private:
    void SpecializedImpl(i2t<true>) {
        // True-specialized implementation
    }

    void SpecializedImpl(i2t<false>) {
        // False-specialized implementation
    }
};</code>

特殊化用の別個のクラス テンプレート

特殊化された動作は、別個のクラス テンプレートに実装し、メイン テンプレート クラス内から呼び出すこともできます。

<code class="cpp">template <typename T, bool B>
struct SpecializedImpl {
    static void call() {
        // True- or false-specialized implementation
    }
};

template <typename T, bool B>
struct X {
    void Specialized() { SpecializedImpl<T, B>::call(); }
};</code>

のネストされたテンプレート クラス特殊化

特殊化された動作は、テンプレート クラスとしてメイン テンプレート クラス内にネストできます。

<code class="cpp">template <typename T, bool B>
struct X {
private:
    template <bool B>
    struct SpecializedImpl { };

public:
    void Specialized() { SpecializedImpl<B>::call(); }

private:
    template <>
    struct SpecializedImpl<true> {
        static void call() {
            // True-specialized implementation
        }
    };

    template <>
    struct SpecializedImpl<false> {
        static void call() {
            // False-specialized implementation
        }
    };
};</code>

以上がC テンプレートでメンバーの専門化を達成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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