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

DDD
リリース: 2024-11-17 16:45:02
オリジナル
185 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート