テンプレートのメンバーの特殊化
テンプレート クラスの特定のメンバーを部分的に特殊化することはできません。部分特殊化では、すべてのテンプレート引数を指定する必要があります。ただし、同様の機能を実現する別のアプローチもあります。
オーバーロードされた関数
回避策の 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 }</t></typename></t></typename></typename></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 } };</false></true></b></typename></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(); } };</t></typename></typename></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 } }; };</false></true></b></bool></typename></code>
以上がC テンプレートでメンバーの専門化を達成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。