首頁  >  文章  >  後端開發  >  如何在 C 中定義函數可用性的類型特徵?

如何在 C 中定義函數可用性的類型特徵?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-09 10:48:02743瀏覽

How to Define a Type Trait for Function Availability in C  ?

元程式設計:作為單獨函數定義的 C 函數定義失敗

在 C 中,可以根據類型特徵定義元函數。例如,可以定義一個模板,根據值的類型是否為算術類型將值轉換為字串:

template<typename T> 
enable_if_t<is_arithmetic<T>::value, string> stringify(T t){
    return to_string(t);
}
template<typename T> 
enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){
    return static_cast<ostringstream&amp;>(ostringstream() << t).str();
}

但是,這種方法依賴於該類型的 is_arithmetic 屬性。更理想的方法是基於該類型的 std::to_string 函數的可用性。然而,將以下要求表達為類型特徵是具有挑戰性的:

「如果為該類型定義了std::to_string,則使用它。」

可以聲明std 的條件: :to_string 可用性:

template<typename T> 
decltype(to_string(T{})) stringify(T t){
    return to_string(t);
}

但不清楚如何建立相反的標準。

使用Walter Brown 的void_t 類型特徵,很容易定義所需的類型特徵:

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 { };

此特徵評估是否為給定類型定義了std::to_string 函數,從而允許根據函數可用性進行更靈活的模板選擇。

以上是如何在 C 中定義函數可用性的類型特徵?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn