C 17 中的部分類別模板參數推導
C 17 功能「類別模板參數推導」(CTAD) 允許編譯器自動推導實例化類別時的模板參數。這簡化了程式碼並消除了指定顯式模板參數的需求。
但是,我們可以部分指定模板參數並讓其餘部分被推導嗎?
嘗試的解決方案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中文網其他相關文章!