C 中基於函數傳回類型的模板推導
在C 中,最好利用模板推導來簡化實例化泛型的程式碼基於函數參數的資料類型的函數。考慮以下範例:
<code class="cpp">GCPtr<A> ptr1 = GC::Allocate(); GCPtr<B> ptr2 = GC::Allocate();</code>
我們的目標不是明確指定泛型類型參數,而是使用 GC::Allocate() 函數的傳回類型來實現此推導。然而,C 不允許根據返回類型進行類型推導。
<code class="cpp">class GC { public: template<typename T> static GCPtr<T> Allocate(); };</code>
儘管傳回類型是泛型,但編譯器需要明確指定模板類型參數; 和實例化 GC::Allocate() 函數時。
為了緩解這個限制,可以引入一個輔助函數:
<code class="cpp">template <typename T> void Allocate(GCPtr<T>& p) { p = GC::Allocate<T>(); }</code>
使用這個函數,可以實現最初的目標,如下:
<code class="cpp">GCPtr<A> p; Allocate(p);</code>
此語法是否比顯式類型規格提供任何顯著優勢是主觀的。
注意:在 C 11 中,可以省略以下之一使用 auto 關鍵字的型別宣告:
<code class="cpp">auto p = GC::Allocate<A>(); // p is of type GCPtr<A></code>
以上是C 可以從函數回傳類型推導出模板類型嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!