次のようなコードに遭遇しました。
class XX
{
public:
template<typename TT> struct YY;
template<typename TT, typename UU> struct YY<std::pair<TT, UU>>
{
std::size_t operator()(std::pair<TT, UU> const& val) const
{
// content omitted for brevity
}
};
};
基本的に、私は混乱していて、このコードを理解するのに助けが必要です。
具体的には、最初のYY宣言は前方宣言ですか?2番目のYY宣言は、部分的なテンプレートの特殊化ですか?2番目のYY宣言に2つのテンプレート引数(TTとUU)があるのに、最初のYY宣言には1つのテンプレート引数(TT)しかないのはなぜですか?最初のYY宣言に定義がないのはなぜですか?
(コードは問題なくコンパイルされます。)
具体的には、最初のYY宣言は前方宣言ですか?
はい。これによりYY<T>
、...を除くすべてのインスタンス化が不完全な型になります。
2番目のYY宣言は、部分的なテンプレートの特殊化ですか?
...完全な定義を提供する特定のタイプまたはタイプのクラス(ポインターなど)に特化したテンプレートがある場合。この特定のケースでは、これはすべてのために適用すること、実際に部分的な特殊であるYY<T>
とT
とのペアタイプであるTT
とUU
。
2番目のYY宣言に2つのテンプレート引数(TTとUU)があるのに、最初のYY宣言には1つのテンプレート引数(TT)しかないのはなぜですか?
コードの作成者は、ペアのタイプに条件を課したくありませんでした。それらは任意です。このような特殊YY
化を作成するstd::pair
ことにより、基本的に、を2つの引数を持つテンプレートとして使用するすべてのインスタンス化を促進します。
最初のYY宣言に定義がないのはなぜですか?
必要ないかもしれないので。スペシャライゼーションを作成するために必要なのは宣言だけです。実際にYY
そこで定義した場合、特殊化が適切でない場合に常にインスタンス化される「デフォルト」のインスタンス化を取得しているはずです。あなたがいる場合したいコンパイルが失敗するあなたは何の専門がないタイプを選択した場合、あなたはそのようにそれを行うことができます。あるいは(そしておそらくより良い)、実際には、static_assert(!std::is_same_v<T, T>)
「不完全なタイプのオブジェクトを作成できません」などよりも意味のあるメッセージとともに、またはそのようなものを含むテンプレートを定義します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加