ホームページ > バックエンド開発 > C++ > ## C 17 はクラス テンプレート引数演繹 (CTAD) でテンプレート引数を部分的に演繹できますか?

## C 17 はクラス テンプレート引数演繹 (CTAD) でテンプレート引数を部分的に演繹できますか?

Susan Sarandon
リリース: 2024-10-25 07:23:02
オリジナル
272 人が閲覧しました

## Can C  17 Partially Deduce Template Arguments in Class Template Argument Deduction (CTAD)?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート