奇怪的重複模板模式(CRTP) 允許C 中的靜態多態性,但當旨在根據派生類型修改函數傳回類型。雖然CRTP 通常可以推斷衍生類型,但以下程式碼在MSVC 2010 中遇到編譯問題:
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; };
出現此錯誤的原因是衍生類別在基底類別中用作基底類別的範本參數時不完整班級名單。為了解決這個問題,一個常見的解決方法是使用特徵類別模板:
// Declare the base_traits class template template <typename derived_t> struct base_traits; // Define the base class template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; }; // Define the derived class template <typename T> struct derived : public base<derived<T>> { typedef typename base_traits<derived<T>>::value_type value_type; }; // Specialization of base_traits for derived template <typename T> struct base_traits<derived<T>> { typedef T value_type; };
透過將base_traits 模板專門化為所需的衍生類型,您可以定義所需的成員,包括foo 等函數的自訂返回類型()。該技術使靜態多態性在回傳類型上具有更大的靈活性,同時避免編譯錯誤。
以上是如何透過 C 靜態多態性 (CRTP) 實現靈活的回傳類型並避免編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!