ホームページ >バックエンド開発 >C++ >部分的な順序付けは関数テンプレート間の特殊化をどのように決定しますか?

部分的な順序付けは関数テンプレート間の特殊化をどのように決定しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-02 07:18:12776ブラウズ

How Does Partial Ordering Determine Specialization Between Function Templates?

テンプレート演繹における部分順序付け手順

テンプレート演繹における部分順序付け手順は、2 つの関数テンプレート間の特殊化関係を決定します。これには 2 つのステージが含まれます:

ステージ 1: 変換

各テンプレートについて、部分順序付けプロシージャは、すべての型と非型を置き換えることによって「変換された関数型」を作成します。 、および一意の未使用タイプを持つテンプレート テンプレート パラメーター。

ステージ 2:比較

変換された関数タイプは 2 つの方法で比較されます:

  • 前方一致: テンプレート 1 の変換された関数タイプは、元の関数タイプと照合されます。テンプレート 2 の関数タイプ。
  • 後方一致: 変換されたテンプレート 2 の関数タイプは、テンプレート 1 の元の関数タイプと照合されます。

一方の照合が成功し、もう一方が失敗した場合、照合が成功したテンプレートがより特殊化されていると見なされます。どちらの一致も成功しない場合、どちらのテンプレートもより特殊化されていません。

例:

次の 2 つの関数テンプレートを考慮します。

template<typename T, typename U>
void foo(T, U); // Template 1

template<typename T>
void foo(T const*, X<T>); // Template 2

決定するにはどちらのテンプレートがより特化されているかというと、

1.変換された関数型の作成:

  • 変換されたテンプレート 1: void foo(int, bool)
  • 変換されたテンプレート 2: void foo(char const*, X)

2.変換された関数の型の比較:

  • 前方一致: void foo(int, bool) は void foo(T const*, X) と一致することはできません。
  • 後方一致: void foo(char const*, X) は void と一致します。 T = char const* および U = X を推定することで foo(T, U) を計算します。

結論: テンプレート 2 はテンプレート 1 よりも特殊です。

以上が部分的な順序付けは関数テンプレート間の特殊化をどのように決定しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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