首頁  >  文章  >  後端開發  >  ## C 17 能否在類別模板參數推導 (CTAD) 中部分推導模板參數?

## C 17 能否在類別模板參數推導 (CTAD) 中部分推導模板參數?

Susan Sarandon
Susan Sarandon原創
2024-10-25 07:23:02200瀏覽

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

C 17 中的部分模板參數推導

C 17 中引入了類別模板參數推導(CTAD),允許編譯器自動推導基於函數參數類型的模板參數。但是,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>
  • 使用模板元程式設計技術根據部分指定的參數有條件地選擇適當的模板。

結論

C 17 中不直接支援部分 CTAD,但有一些解決方法可以實現類似的功能。即將推出的 C 20 標準預計將包括對具有別名模板的 CTAD 的支持,但目前不包括對部分 CTAD 或具有繼承構造函數的 CTAD 的支持。

以上是## C 17 能否在類別模板參數推導 (CTAD) 中部分推導模板參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn