C 中的靜態多態性與Typedef
奇怪的循環模板模式(CRTP) 是C 中實現靜態多態性的一種技術。但是,當嘗試推廣此模式以根據派生類型修改返回類型時,程式碼可能無法編譯,就像使用 MSVC 2010 的使用者所遇到的那樣。
問題:
以下程式碼旨在允許在衍生類別中使用不同的回傳類型,但無法編譯:
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; value_type foo() { return static_cast<derived_t*>(this)->foo(); } }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; value_type foo() { return T(); } };
錯誤遇到的是「不是'派生'的成員。」出現這種情況是因為派生類型在用作其基類的模板參數時不完整。
使用 Traits 的解決方案:
常見的解決方法是使用特徵類別範本。在此方法中,定義了一個 base_traits 類別模板來封裝衍生類別中的類型和函數。修改原始基底類別以使用這些特徵。
template <typename derived_t> struct base_traits; template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; value_type base_foo() { return base_traits<derived_t>::call_foo(static_cast<derived_t*>(this)); } }; template <typename T> struct derived : base<derived<T>> { typedef typename base_traits<derived>::value_type value_type; value_type derived_foo() { return value_type(); } }; template <typename T> struct base_traits<derived<T>> { typedef T value_type; static value_type call_foo(derived<T>* x) { return x->derived_foo(); } };
透過為派生模板參數中使用的每種類型專門化 base_traits 類,可以透過特徵存取所需的類型和函數,從而啟用靜態多態性和動態返回類型。
以上是C Traits 如何解決奇怪的重複模板模式中靜態多型性和 Typedef 的編譯問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!