C 17 の部分的なクラス テンプレート引数の推論
C 17 の機能「クラス テンプレート引数の推論」(CTAD) を使用すると、コンパイラーは自動的に推論できます。インスタンス化時のクラスのテンプレート引数。これにより、コードが簡素化され、明示的なテンプレート引数を指定する必要がなくなります。
しかし、テンプレート引数を部分的に指定し、残りを推測させることはできますか?
試行される解決策 1:
部分的な推論を実現する 1 つの試みには、次のようなエイリアス テンプレートの作成が含まれます。
<code class="cpp">template<class T, class U> using Base2 = Base<T, U, double>;</code>
次に、エイリアスを使用して引数を部分的に指定します。
<code class="cpp">void func() { Base2 val(1, 2); }</code>
ただし、これによりコンパイル エラーが発生し、エイリアス テンプレートの使用には完全なテンプレート引数リストが必要であることが示されます。
回避策:
残念ながら、部分推論は では直接サポートされていません。 C 17. ただし、次のような回避策がいくつかあります。
1.オーバーロード ヘルパー関数:
指定された引数のさまざまなセットを使用してオーバーロード関数を作成し、推論に最も具体的なオーバーロードを使用します:
<code class="cpp">template<class T, class U> void func(Base<T, U> val) { } template<class T> void func(Base<T, double> val) { } template<> void func(Base<double> val) { }</code>
2.明示的な引数の推論:
明示的なテンプレート引数の推論を使用して、他の引数を推論しながら特定の引数を指定します:
<code class="cpp">Base val(1, static_cast<double>(4.), false);</code>
3.可変個引数テンプレートを利用する:
複数の引数を受け入れ、テンプレート引数を推定できる可変個引数テンプレートを作成する:
<code class="cpp">template<typename... Args> class Base { public: Base(Args&&... args) { // Custom logic to deduce template arguments from args... } };</code>
結論:
部分的なクラス テンプレート引数の推定は、C 17 では直接サポートされていません。ただし、関数のオーバーロード、明示的な推定、または可変個引数テンプレートなどの回避策を使用することで、同様の効果を達成することが可能です。
以上が## C 17 のクラス テンプレートのテンプレート引数を部分的に推定できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。