元程式設計:基於函數重載的範本選擇
在C 元程式設計中,依照型別屬性有條件定義範本函數是一種常見技術。然而,在某些情況下,定義相反的場景可能具有挑戰性,即根據特定功能的缺失來選擇模板。
具體來說,在提供的範例中,目標是定義一個範本在兩個實作之間進行選擇的函數stringify:
當試圖表達後一個條件時就會出現問題。以下不成功的嘗試嘗試使用嵌套的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中文網其他相關文章!