テンプレートを使用した暗黙的な型変換
このクエリは、テンプレート クラスで暗黙的な型変換を有効にする問題を調査します。整数を受け入れるコンストラクターを持つテンプレート クラス A のケースを考えてみましょう。
template <unsigned int m> class A { public: A(int); };
さらに、2 つの A オブジェクトが与えられた場合に A のインスタンスを返す演算子 ' ' があります。
template<unsigned int m> A<m> operator+(const A<m>&, const A<m>&) { return A<m>(0); }
問題は、整数を A オブジェクトに暗黙的に変換しようとすると発生します。たとえば、次のコードはそうしようとしますが、コンパイラはエラーをスローします。
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
解決策
解決策は言語の機能を利用することにあります。これにより、クラス定義内で非メンバーのフレンド関数を定義できるようになります。テンプレートの場合、テンプレートのインスタンス化ごとに、コンパイラーは、フレンド宣言内のインスタンス化の実型を置き換えることによって得られた署名を持つ、無料の非テンプレート関数を生成します。
template <typename T> class test { friend test operator+(test const &, test const &); // [1] }; test<int> t; // [2]
In [ 1] を使用すると、コンパイラはクラス スコープ内でのフレンド関数の定義を許可します。次に、[2] では、テンプレートがインスタンス化されるときに、コンパイラーは自由な関数を生成します。
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
この非テンプレート関数は、使用されているかどうかに関係なく、常に定義されます。
暗黙的変換の魔法
ここでの「魔法」は次の側面にあります:
ただし、この解決策にはいくつかの制限もあります。
これらの制限にもかかわらず、このソリューションは、テンプレート クラス内で暗黙的な変換を可能にする洗練された方法を提供し、より柔軟で便利なコードを可能にします。 .
以上がテンプレート クラスで暗黙的な型変換を有効にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。