テンプレート フレンド関数を使用したエレガントな暗黙的な型変換
テンプレート クラスを扱う場合、暗黙的な型変換を有効にするのは困難な場合があります。 int を受け取るコンストラクターと加算用の演算子オーバーロードを備えたクラス テンプレート A を考えてみましょう。
template <unsigned int m> class A { public: A(int) {} }; template<unsigned int m> A<m> operator+(const A<m>&, const A<m>&) { return A<m>(0); }
通常、int を使用してコンストラクターを呼び出すには、明示的なキャストが必要です。ただし、次の例ではコンパイル エラーが発生します。
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
正確な型一致の問題
問題は、テンプレート関数のオーバーロード解決がどのように機能するかにあります。型推論中に、コンパイラはテンプレート パラメーターと完全に一致するものを探します。私たちの場合、型が正確に一致していないため、int 引数をコンストラクターに一致させることができません。
解決策: 非メンバーのフレンド関数
1 つのエレガントな関数解決策は、クラス定義内で非メンバーのフレンド関数を定義することです:
template <typename T> class test { friend test operator+(test const &, test const &) { return test(); } };
テンプレートのインスタンス化ごとに、コンパイラは適切なシグネチャを持つ名前空間レベルで個別の非テンプレート関数を生成します:
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
非メンバーフレンド関数の利点
以上がテンプレートフレンド関数を使用してエレガントな暗黙的な型変換を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。