C++ で不純なテンプレートを書くことは可能ですか? つまり、同じテンプレート パラメーターに対して異なる結果の型または int を与えることがあるテンプレートです。たとえば、あるときとあるときのテンプレートFoo<T>
を書くことは可能ですか? または、10 の場合もあれば 20 の場合もあるテンプレートはありますか?Foo<int>::type
char
float
Foo<T>
Foo<double>::my_static_const_int
1 に答える
不可能です。そのように動作するテンプレートがある場合、それは ODR および/またはインスタンス化される前に特殊化を宣言する必要があるなどのその他の規則に違反しています。したがって、typedef メンバーを何らかの方法で変更して、後続のすべての参照に対して別の型に解決する特殊化を配置することはできません。
がクラス テンプレートの場合はクラスをFoo<T>
参照することに注意してください。Foo
クラスの typedef メンバーが、プログラムのある時点で 1 つの型として定義され、別の時点で別の型として定義されている場合、何かが間違っているに違いありません。これに関連するさまざまな標準的な引用があります
関数テンプレート、メンバー関数テンプレート、またはクラス テンプレートのメンバー関数または静的データ メンバーの特殊化は、翻訳単位内にインスタンス化の複数のポイントを持つ場合があります。クラス テンプレートの特殊化は、翻訳単位内に最大 1 つのインスタンス化ポイントを持ちます。テンプレートの特殊化には、複数の翻訳単位でインスタンス化のポイントがある場合があります。インスタンス化の 2 つの異なるポイントが、1 つの定義規則 (3.2) に従ってテンプレートの特殊化に異なる意味を与える場合、プログラムは形式が正しくなく、診断は必要ありません。
テンプレート、メンバー テンプレート、またはクラス テンプレートのメンバーが明示的に特殊化されている場合、その特殊化は、そのような使用が発生するすべての翻訳単位で、暗黙的なインスタンス化を発生させる特殊化の最初の使用の前に宣言する必要があります。 ; 診断は必要ありません。
(各種「ノイズ」は飛ばします)
[..プログラム全体で複数定義できるさまざまなエンティティ..]. D という名前のエンティティが複数の翻訳単位で定義されている場合、
- D の各定義は、同じ一連のトークンで構成されます。
- D の各定義では、対応する名前は、3.4 に従って検索され、D の定義内で定義されたエンティティを参照するか、またはオーバーロードの解決 (13.3) および部分的なテンプレートの特殊化の一致 (14.8) の後に同じエンティティを参照する必要があります。 .3)...
- D がテンプレートであり、複数の翻訳単位で定義されている場合、上記のリストの最後の 4 つの要件は、テンプレート定義 (14.6.3) で使用されるテンプレートの囲みスコープからの名前、および従属名にも適用されます。インスタンス化の時点 (14.6.2)。D の定義がこれらの要件をすべて満たす場合、プログラムは D の定義が 1 つしかないかのように動作します。D の定義がこれらの要件を満たさない場合、動作は未定義です。