元程式設計:作為單獨函數定義的 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&>(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中文網其他相關文章!