質問

C++ で不純なテンプレートを作成することは可能ですか?つまり、同じテンプレート パラメーターに対して異なる結果の型または int が得られる場合があるテンプレートです。たとえば、テンプレートを書くことは可能ですか Foo<T> どこ Foo<int>::type 時々ある char そしてまた別の時には float?またはテンプレート Foo<T> どこ Foo<double>::my_static_const_int 10の時もあれば20の時もある?

役に立ちましたか?

解決

不可能です。そのように動作するテンプレートがある場合、それは ODR やその他のルール (特殊化をインスタンス化する前に宣言する必要があるなど) に違反します。そのため、typedef メンバーを何らかの形で変更して、後続のすべての参照に対して別の型に解決するような特殊化を単に配置することはできません。

覚えておいてください Foo<T> クラスを参照する場合 Foo クラステンプレートです。クラスの typedef メンバーが、プログラムのある時点では 1 つの型として定義され、別の時点では別の型として定義されている場合は、何か問題があったと考えられます。これに関連するさまざまな標準の引用を次に示します。


関数テンプレート、メンバー関数テンプレート、またはクラス テンプレートのメンバー関数または静的データ メンバーの特殊化では、変換単位内に複数のインスタンス化ポイントが存在する場合があります。クラス テンプレートの特殊化では、翻訳単位内にインスタンス化のポイントが最大 1 つあります。どのテンプレートの特殊化でも、複数の翻訳単位でインスタンス化のポイントが存在する場合があります。2 つの異なるインスタンス化ポイントで、1 つの定義ルール (3.2) に従ってテンプレート特殊化に異なる意味が与えられる場合、プログラムは不正な形式であり、診断は必要ありません。


テンプレート、メンバー テンプレート、またはクラス テンプレートのメンバーが明示的に特殊化されている場合、その特殊化は、暗黙的なインスタンス化が発生する特殊化の最初の使用前に、そのような使用が発生するすべての翻訳単位で宣言されなければなりません。 ;診断は必要ありません。


(様々な「ノイズ」はスキップされます)

[..プログラム全体で複数定義できるさまざまなエンティティ..]。複数の翻訳単位で定義された D という名前のエンティティがあるとすると、

  • D の各定義は、同じトークンのシーケンスで構成されます。
  • D の各定義では、3.4 に従って検索された対応する名前は、オーバーロード解決 (13.3) および部分的なテンプレートの特殊化 (14.8) のマッチング後、D の定義内で定義されたエンティティを参照するか、同じエンティティを参照します。 .3)...
  • Dがテンプレートであり、複数の翻訳ユニットで定義されている場合、上記のリストの最後の4つの要件は、テンプレート定義(14.6.3)で使用されているテンプレートのエンコリングスコープの名前に適用され、依存名にも適用されます。インスタンス化の時点(14.6.2)。D の定義がこれらすべての要件を満たしている場合、プログラムは D の定義が 1 つ存在するかのように動作します。D の定義がこれらの要件を満たさない場合、動作は未定義です。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top