Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah CRTP dalam C Boleh Mengendalikan Typedefs daripada Kelas Terbitan untuk Polimorfisme Statik?

Bagaimanakah CRTP dalam C Boleh Mengendalikan Typedefs daripada Kelas Terbitan untuk Polimorfisme Statik?

DDD
Lepaskan: 2024-12-10 09:42:18
asal
967 orang telah melayarinya

How Can CRTP in C   Handle Typedefs from Derived Classes for Static Polymorphism?

C Static Polymorphism (CRTP) dengan Typedefs daripada Derived Classes

Dalam polimorfisme statik, juga dikenali sebagai polimorfisme masa kompilasi, jenis-jenis kelas terbitan diketahui oleh kelas asas pada masa penyusunan. Ini boleh dicapai menggunakan corak templat berulang secara ingin tahu (CRTP). Walau bagaimanapun, anda mungkin mahu menyesuaikan jenis fungsi pemulangan berdasarkan jenis terbitan.

Pertimbangkan kod berikut:

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(); //return some T object (assumes T is default constructable)
    }
};
Salin selepas log masuk

Walau bagaimanapun, kod ini mungkin tidak dikompilkan kerana penggunaan jenis alias value_type daripada kelas terbitan dalam templat kelas asas. Ralatnya ialah terbitan tidak lengkap apabila digunakan sebagai hujah templat untuk asas.

Satu penyelesaian ialah menggunakan templat kelas sifat. Berikut ialah contoh yang diubah suai:

// Declare a base_traits traits class template:
template <typename derived_t> 
struct base_traits;

// Define the base class that uses the 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));
    }
};

// Define the derived class; it can use the traits too:
template <typename T>
struct derived : base<derived<T>> { 
    typedef typename base_traits<derived>::value_type value_type;

    value_type derived_foo() { 
        return value_type(); 
    }
};

// Declare and define a base_traits specialization for derived:
template <typename T> 
struct base_traits<derived<T>> {
    typedef T value_type;

    static value_type call_foo(derived<T>* x) { 
        return x->derived_foo(); 
    }
};
Salin selepas log masuk

Dengan mengkhususkan base_traits untuk setiap jenis terbitan, anda boleh menyediakan ahli yang diperlukan (value_type dan call_foo) yang diperlukan oleh templat kelas asas. Ini membolehkan anda mengakses typedef dan fungsi daripada kelas terbitan dalam templat kelas asas, mencapai polimorfisme statik dengan jenis pulangan tersuai.

Atas ialah kandungan terperinci Bagaimanakah CRTP dalam C Boleh Mengendalikan Typedefs daripada Kelas Terbitan untuk Polimorfisme Statik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan