首頁 > 後端開發 > C++ > 主體

如何在可變參數函數中強制型別一致性?

Barbara Streisand
發布: 2024-11-10 04:30:02
原創
252 人瀏覽過

How to Enforce Type Uniformity in Variadic Functions?

確保可變參數函數中參數類型的一致性

在這種情況下,我們的目標是創建一個可以接受可變數量參數的函數,但要確保所有參數的類型相同。我們尋求在不訴諸數組或向量等額外資料結構的情況下實現這一目標。

可變參數函數

可變參數函數本身並未為其參數提供型別安全。為了強制型別一致性,請考慮使用可變參數模板函數。

可變參數模板函數

可變參數模板函數可以定義如下:

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。然後,您可以使用任何可用的方法將此數組轉換為您的 Dragon_list_t 類型。

與 SFINAE 組合

將此方法與前面描述的 SFINAE 技術結合,您可以建立拒絕任何不可轉換為 Maiden 的參數的模板。

以上是如何在可變參數函數中強制型別一致性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!