Godot Source Code Note 4
模板參數(shù)展開
可變參數(shù)模板分為類型模板形參包與函數(shù)形參包。
先上一段Godot源碼:
可以看到,代碼中使用了一種初始化列表展開的方法,本文簡要介紹幾種類似方法。
C++11之前:
> 遞歸模板函數(shù)
此方法必須要定義一個遞歸終止函數(shù),很不簡潔。
遞歸函數(shù)調(diào)用容易引起棧溢出。
C++11:
> 初始化列表展開
這里借助了逗號表達式的特性,括號中用逗號分隔的表達式會以從左往右的順序執(zhí)行,最后返回最右邊表達式的結果。在(std::cout << args << std::endl, 0)...包展開中,逗號左邊的輸出語句先被執(zhí)行,然后逗號右邊的0返回作為數(shù)組的元素。因此,如果sizeof...(args)為3的話,那么temp數(shù)組為{0, 0, 0}。
上面展示的Godot源代碼即使用了此方法。
C++17:
> 折疊表達式
相當簡潔,但要掌握集中折疊規(guī)則。
容易出錯。
> constexpr if 編譯時條件判斷
constexpr if語句使得模板函數(shù)在編譯期就可以完成條件判斷,而不是運行時。
constexpr if語句起到了一個類似條件編譯的效果。
挖個坑,以后有機會可以談談constexpr。
部分參考《現(xiàn)代C++語言核心特性解析》《現(xiàn)代C++教程》
如侵刪。
歡迎評論指正。
標簽: