確保可變參數函數中參數類型的一致性
在這種情況下,我們的目標是創建一個可以接受可變數量參數的函數,但要確保所有參數的類型相同。我們尋求在不訴諸數組或向量等額外資料結構的情況下實現這一目標。
可變參數函數
可變參數函數本身並未為其參數提供型別安全。為了強制型別一致性,請考慮使用可變參數模板函數。
可變參數模板函數
可變參數模板函數可以定義如下:
template<typename... Args> return_type function_name(Args...);
在此模板中,Args...表示可以傳遞給function.
類型檢查強制
為了確保所有參數的類型相同,我們可以使用SFINAE(替換失敗不是錯誤)。 SFINAE 允許我們建立一個模板,在編譯期間偵測給定條件是 true 還是 false。
這裡有一個範例:
template<typename R, typename... Args> struct fst { typedef R type; }; template<typename ...Args> typename fst<void, typename enable_if< is_convertible<Args, ToType>::value >::type... >::type f(Args...);
在此範本中,僅允許使用 f()接受可轉換為 ToType 類型(表示所需參數類型)的參數。此配置拒絕任何不可轉換為 ToType 的參數。
使用案例解決方案
對於您的特定用例,您可以使用以下內容:
template<typename ...Items> dragon_list_t make_dragon_list(Items... maidens) { std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }}; // here be dragons }
此範本將變數參數轉換為std ::array
與 SFINAE 組合
將此方法與前面描述的 SFINAE 技術結合,您可以建立拒絕任何不可轉換為 Maiden 的參數的模板。
以上是如何在可變參數函數中強制型別一致性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!