関数テンプレート演繹における部分順序付け
問題:
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
したがって、関数テンプレート #2関数テンプレート #1 よりも特殊化されています。
補足:
これ部分順序付けプロシージャは、部分クラス テンプレートの特殊化の比較にも使用されます。この場合の手順では、まず特殊化ごとに架空の関数テンプレートを作成し、次に同じルールを使用してこれらの関数テンプレートを比較します。
以上がC 11 の部分順序付けは、より特殊な関数テンプレートをどのように決定するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。