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

C 11 の部分順序付けは、より特殊な関数テンプレートをどのように決定するのでしょうか?

Susan Sarandon
リリース: 2024-12-05 10:37:10
オリジナル
690 人が閲覧しました

How Does C  11's Partial Ordering Determine More Specialized Function Templates?

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

問題:

C 11 標準では、関数テンプレートの特殊化を比較するための部分的な順序付け手順ですが、その意味は完全には明確ではありません。例を挙げて説明していただけますか?

回答:

ある関数テンプレートが別の関数テンプレートより特化しているかどうかを判断するために、標準では部分順序付け手順が使用されます。この手順には、テンプレートごとに変換された関数タイプを作成し、それらを比較してどのテンプレートがより特化されているかを判断することが含まれます。

ステップ 1: 変換された関数タイプを作成する

各テンプレートについて、変換された関数型は、型パラメーターを特定の型 (合成型と呼ばれる) に置き換えることによって作成されます。これらの合成された型は一意であり、コード内の他の場所では使用されません。

ステップ 2: 変換された型を元のテンプレートに一致させる

最初のテンプレートの変換された関数の型が一致します。 2 番目のテンプレートの元の関数タイプに対して。次に、このプロセスが逆方向に繰り返されます。

ステップ 3: 特殊化の決定

一方の変換で一致が生成され、もう一方の変換では一致しない場合、一致した変換を持つテンプレートが作成されます。変換はより専門化されたものとみなされます。どちらの方向にも一致が見つからない場合、どちらのテンプレートも他方よりも特殊化されているとは見なされません。

例:

2 つの関数テンプレートを考えます:

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

template<typename T>
void foo(T const*, X<T>); // #2
ログイン後にコピー

#1b の変換された関数型 (void foo(int, bool)) を #2 の元の関数型と照合します。 (#2) は失敗します。ただし、変換された関数型 #2b (void foo(char const*, X)) と元の関数型 #1 (#1) のマッチングは成功します。

したがって、関数テンプレート #2関数テンプレート #1 よりも特殊化されています。

補足:

これ部分順序付けプロシージャは、部分クラス テンプレートの特殊化の比較にも使用されます。この場合の手順では、まず特殊化ごとに架空の関数テンプレートを作成し、次に同じルールを使用してこれらの関数テンプレートを比較します。

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

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