ホームページ  >  記事  >  バックエンド開発  >  テンプレート クラスで暗黙的な型変換を有効にするにはどうすればよいですか?

テンプレート クラスで暗黙的な型変換を有効にするにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-17 16:45:02186ブラウズ

How Can Implicit Type Conversion Be Enabled in Template Classes?

テンプレートを使用した暗黙的な型変換

このクエリは、テンプレート クラスで暗黙的な型変換を有効にする問題を調査します。整数を受け入れるコンストラクターを持つテンプレート クラス 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>();
}

この非テンプレート関数は、使用されているかどうかに関係なく、常に定義されます。

暗黙的変換の魔法

ここでの「魔法」は次の側面にあります:

  • 一般的な定義:テンプレート関数は、インスタンス化された型ごとに一般的に定義され、汎用性と、引数が完全に一致しない場合に使用する機能の両方を提供します。
  • 暗黙的な変換: これは非テンプレート関数であるため、コンパイラは両方の引数で暗黙的な変換を呼び出して、予期した動作を有効にすることができます。
  • 引数依存ルックアップ: 関数は引数依存ルックアップでのみ見つけることができます。これは、少なくとも次の場合にのみ考慮されることを意味します。引数の 1 つは目的の型です。

ただし、この解決策にはいくつかの制限もあります。

  • 関数は ADL を通じてのみアクセスできるため、関数の可視性が制限されます。 .
  • それへの関数ポインタを取得できなくなります。

これらの制限にもかかわらず、このソリューションは、テンプレート クラス内で暗黙的な変換を可能にする洗練された方法を提供し、より柔軟で便利なコードを可能にします。 .

以上がテンプレート クラスで暗黙的な型変換を有効にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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