首頁 > 後端開發 > C++ > C 元編程中如何實現基於函數缺失的模板選擇?

C 元編程中如何實現基於函數缺失的模板選擇?

Mary-Kate Olsen
發布: 2024-11-09 20:36:02
原創
384 人瀏覽過

How Can We Implement Template Selection Based on the Absence of a Function in C   Metaprogramming?

元程式設計:基於函數重載的範本選擇

在C 元程式設計中,依照型別屬性有條件定義範本函數是一種常見技術。然而,在某些情況下,定義相反的場景可能具有挑戰性,即根據特定功能的缺失來選擇模板。

具體來說,在提供的範例中,目標是定義一個範本在兩個實作之間進行選擇的函數stringify:

  • 如果為給定類型定義了std ::to_string,則使用to_string(t) 將值轉換為字串。
  • 如果 std ::to_string 沒有為此型別定義,請使用 ostringstream()

當試圖表達後一個條件時就會出現問題。以下不成功的嘗試嘗試使用嵌套的enable_if模板來檢查to_string是否未定義:

template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){
    return static_cast<ostringstream&>(ostringstream() << t).str();
}
登入後複製

要解決這個問題,我們可以利用Walter Brown的void_t類型特徵:

template <typename...>
using void_t = void;
登入後複製

使用它,我們可以定義has_to_string特徵,如下所示:

template<typename T, typename = void>
struct has_to_string
: std::false_type { };

template<typename T>
struct has_to_string<T, 
    void_t<decltype(std::to_string(std::declval<T>()))>
    > 
: std::true_type { };
登入後複製

現在,可以使用基於has_to_string 特徵的條件模板專門化來定義stringify 模板:

template<typename T>
enable_if_t<has_to_string<T>::value, string> stringify(T t){
    return std::to_string(t);
}

template<typename T>
enable_if_t<!has_to_string<T>::value, string> stringify(T t){
    return static_cast<ostringstream&>(ostringstream() << t).str();
}
登入後複製

此解決方案根據是否為給定類型定義了std::to_string 有效地選擇stringify 的適當實作。

以上是C 元編程中如何實現基於函數缺失的模板選擇?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板