C 17 の部分テンプレート引数演繹
クラス テンプレート引数演繹 (CTAD) が C 17 で導入され、コンパイラーが自動的に演繹できるようになりました。関数の引数の型に基づくテンプレート引数。ただし、CTAD では現在、すべてのテンプレート引数を推定するか、明示的に指定する必要があります。テンプレート引数を部分的に指定し、残りの引数を推測させることは可能ですか?
次の例を考えてみましょう:
<code class="cpp">template<class T, class U, class V> struct Base { constexpr Base(T, U) {} constexpr Base(T, U, V) {} constexpr Base(V) {} }; void func() { constexpr Base val(1, 4.0, false); }</code>
CTAD を使用すると、コンパイラは val の型が Base< であると正しく推測します。 ;int、double、bool>。ただし、次の例のように、テンプレート引数を部分的に指定したい場合はどうすればよいでしょうか?
<code class="cpp"> constexpr Base<T = bool> val1(1, 4.0); // U & V deduced -> Base<int, double, bool> constexpr Base<T = bool, T = int> val2(5.0); // V deduced -> Base<bool, int, double></code>
残念ながら、このコードはコンパイルされません。コンパイラでは、すべてのテンプレート引数が推定されるか、明示的に指定される必要があるためです。 .
回避策
部分 CTAD は直接サポートされていないため、使用できる回避策がいくつかあります。
<code class="cpp">using NewBase2 = Base<double, int>; void func() { constexpr NewBase2 val(1, 2); }</code>
結論
部分 CTAD は C 17 では直接サポートされていませんが、同様の機能を実現するために利用できる回避策があります。次期 C 20 標準には、エイリアス テンプレートを使用した CTAD のサポートが含まれる予定ですが、現時点では部分 CTAD または継承されたコンストラクターを使用した CTAD のサポートは含まれていません。
以上が## C 17 はクラス テンプレート引数演繹 (CTAD) でテンプレート引数を部分的に演繹できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。