首頁  >  文章  >  後端開發  >  ## 我們可以部分推導 C 17 中類別模板的模板參數嗎?

## 我們可以部分推導 C 17 中類別模板的模板參數嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-25 07:36:29686瀏覽

## Can We Partially Deduce Template Arguments for Class Templates in C  17?

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

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