C でのクラス メンバー関数の部分特殊化
部分特殊化により、テンプレート化されたクラスまたは関数の特定のインスタンス化の特殊化が可能になります。これは、異なるテンプレート引数値に対して異なる動作が必要な場合に役立ちます。ただし、初心者がよく遭遇する障害は、クラス メンバー関数の部分特殊化です。
クラス メンバー関数を部分的に特殊化するには、部分的に特殊化されたクラス テンプレートを関数として受け取る非メンバー テンプレート関数を定義する必要があります。パラメータ。たとえば、次のコードについて考えてみましょう。
template <typename T, int nValue> class Object { private: T m_t; Object(); // Private constructor public: Object(T t): m_t(t) {} T Get() { return m_t; } Object& Deform() { m_t *= nValue; return *this; } }; // Partial specialization of the Deform() method for nValue = 0 template <typename T> Object<T, 0>& Object<T, 0>::Deform() { this->m_t = -1; return *this; }
この例では、Deform() メンバー関数は、nValue が 0 の場合に部分的に特殊化されています。nValue の他のすべての値については、デフォルトの動作は次のようになります。適用済み。これにより、nValue が 0 の場合のカスタム動作が可能になり、その他の場合には汎用実装を維持できます。
注: 単一のメンバー関数のみを部分的に特殊化することはできないことに注意することが重要です。メンバー関数を部分的に特殊化するには、クラス全体を部分的に特殊化する必要があります。これは、以下の正しいコードに反映されています:
template <typename T> class Object<T, 0> { private: T m_t; Object(); // Private constructor public: Object(T t): m_t(t) {} T Get() { return m_t; } Object& Deform() { std::cout << "Spec\n"; m_t = -1; return *this; } };
以上がC でクラス メンバー関数を部分的に特殊化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。