ホームページ >バックエンド開発 >C++ >クラス テンプレートのメンバー関数を正しく明示的に特殊化するにはどうすればよいですか?

クラス テンプレートのメンバー関数を正しく明示的に特殊化するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-27 22:47:10601ブラウズ

How to Correctly Explicitly Specialize a Member Function of a Class Template?

明示的に特殊化されたメンバー関数を含むテンプレート クラス

クラス テンプレートのメンバー関数に対して明示的に特殊化を定義する場合、次のような場合に一般的な落とし穴が発生します。周囲のクラステンプレートもテンプレートです。この問題を理解するために、次の例を考えてみましょう。

#include <iostream>
#include <cmath>

template <class C> class X {
public:
   template <class T> void get_as();
};

template <class C>
void X<C>::get_as<double>() {}  // Explicit specialization for double

int main() {
   X<int> x;
   x.get_as();
}

このコードは、X クラス テンプレートの double 用に get_as メンバー関数を明示的に特殊化しようとしています。ただし、周囲のクラス テンプレートが明示的に特殊化されていないため、このアプローチではコンパイラ エラーが発生します。

間違ったアプローチ:

クラスを特殊化せずにメンバー関数を明示的に特殊化しようとしました。以下に示すように、テンプレートは不正解:

template <class C> template<>
void X<C>::get_as<double>() {}

正しい解決策:

問題を解決するには、クラス テンプレートとメンバー関数の両方を明示的に特殊化する必要があります。たとえば、get_as 関数を X のみに特化するには、次のアプローチを使用します。

template <>
template <class T>
void X<int>::get_as() {}

template <>
void X<int>::get_as<double>() {}

代替オプション:

あるいは、周囲の要素を維持するには特殊化されていないクラス テンプレートでは、次のように get_as 関数のオーバーロードを使用できます。コード:

template <class C> class X {
   template<typename T> struct type { };

public:
   template <class T> void get_as() {
     get_as(type<T>());
   }

private:
   template<typename T> void get_as(type<T>) {}

   void get_as(type<double>) {}
};

以上がクラス テンプレートのメンバー関数を正しく明示的に特殊化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。