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中文網其他相關文章!