テンプレート クラス メンバーの部分的な特殊化
テンプレート クラスの特定のメンバーを特殊化することは可能ですか?例:
<code class="cpp">template <typename T, bool B> struct X { void Specialized(); }; template <typename T> void X<T, true>::Specialized() { // ... } template <typename T> void X<T, false>::Specialized() { // ... }</code>
答え:
クラス テンプレート内のメンバー関数の直接の部分特殊化は許可されません。ただし、完全な特殊化を提供できます:
<code class="cpp">template <> void X<int, true>::Specialized() { // ... }</code>
回避策:
1.オーバーロードされた関数:
メンバー関数のオーバーロードを導入すると、クラス メンバーへのアクセスを保持しながら同様の効果を達成できます:
<code class="cpp">template <typename T, bool B> struct X { void Specialized() { SpecializedImpl(i2t<B>()); } private: void SpecializedImpl(i2t<true>) { // ... } void SpecializedImpl(i2t<false>) { // ... } };</code>
2.クラス テンプレートに従う:
別のオプションは、特殊な実装用に別のクラス テンプレートを定義することです:
<code class="cpp">template <typename T, bool B> void X::Specialized() { SpecializedImpl<T, B>::call(); }</code>
3.関数オーバーロード用の SpecializedImpl:
このアプローチは i2t アプローチをエミュレートしますが、任意のパラメーターの特殊化が可能です:
<code class="cpp">template <typename T, bool B> struct X { void Specialized() { Specialized(SpecializedImpl<T, B>()); } private: template <typename U> void Specialized(SpecializedImpl<U, true>) { // ... } template <typename U> void Specialized(SpecializedImpl<U, false>) { // ... } };</code>
結論:
メンバー関数を直接部分的に特殊化することはできませんが、これらの回避策は同様の機能を実現するための効果的な代替手段となります。どのアプローチを選択するかは、開発者の特定の要件と好みによって異なります。
以上がテンプレートクラスのメンバー関数を部分的に特殊化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。