テンプレートのメンバーの特殊化
テンプレート クラスの特定のメンバーを部分的に特殊化することはできません。部分特殊化では、すべてのテンプレート引数を指定する必要があります。ただし、同様の機能を実現する別のアプローチもあります。
オーバーロードされた関数
回避策の 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 サイトの他の関連記事を参照してください。