當內部函數本身是泛型時,在C 中定義泛型函數會遇到挑戰。本文探討了使用模板模板參數來克服此障礙的解決方案。
請考慮以下說明問題的程式碼片段:
<code class="cpp">template<typename T> void a(T t) { // do something } template<typename T> void b(T t) { // something else } template< ...param... > // ??? void function() { param<SomeType>(someobj); param<AnotherType>(someotherobj); } void test() { function<a>(); function<b>(); }</code>
決定如何正確定義函數範本會出現困難。為了解決這個問題,我們採用了一種稱為「模板模板參數」的技術。
模板模板參數使我們能夠將模板函數作為參數傳遞給其他模板。這提供了創建對特定模板函數集進行操作的通用函數的靈活性。
但是,有一個問題:我們不能直接將模板函數當作型別傳遞。相反,我們必須使用虛擬結構的解決方法。
以下程式碼範例了解決方法:
<code class="cpp">template <typename T> struct a { static void foo (T = T ()) { } }; template <typename T> struct b { static void foo (T = T ()) { } }; struct SomeObj {}; struct SomeOtherObj {}; template <template <typename P> class T> void function () { T<SomeObj>::foo (); T<SomeOtherObj>::foo (); } int main () { function<a>(); function<b>(); }</code>
虛擬結構 a 和 b 服務作為模板函數的佔位符。他們提供了一個什麼都不做的方法 foo,主要是為了滿足語法要求。
函數模板接受一個模板模板參數 T,它指定要執行的模板函數的類型。然後,它為兩種不同類型的物件 SomeObj 和 SomeOtherObj 呼叫 foo。
透過使用這種方法,我們可以定義以靈活且類型安全的方式對一組模板函數進行操作的泛型函數。
以上是我們如何在 C 中編寫一個接受模板函數作為參數的通用函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!