テンプレート メンバー関数の部分的な特殊化
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 サイトの他の関連記事を参照してください。