首頁 >後端開發 >C++ >C Traits 如何解決奇怪的重複模板模式中靜態多型性和 Typedef 的編譯問題?

C Traits 如何解決奇怪的重複模板模式中靜態多型性和 Typedef 的編譯問題?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-11 01:51:09241瀏覽

How Can C   Traits Solve Compilation Issues with Static Polymorphism and Typedefs in the Curiously Recurring Template Pattern?

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中文網其他相關文章!

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