Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengehadkan Jenis Templat dalam C Seperti Kata Kunci `extends` Java?

Bagaimanakah Saya Boleh Mengehadkan Jenis Templat dalam C Seperti Kata Kunci `extends` Java?

DDD
DDDasal
2024-12-20 11:39:10989semak imbas

How Can I Restrict Template Types in C   Like Java's `extends` Keyword?

Mengekang Jenis Templat dalam C

Di Java, anda boleh mengehadkan kelas generik untuk hanya menerima jenis yang melanjutkan kelas asas tertentu menggunakan memanjangkan kata kunci. Adakah terdapat kata kunci yang serupa dalam C untuk tujuan ini?

C Setara

C tidak mempunyai setara langsung dengan kata kunci lanjutan Java untuk kekangan templat. Walau bagaimanapun, C 11 menyediakan mekanisme alternatif untuk mencapai kesan yang sama.

C 11 Pendekatan Menggunakan Jenis Ciri

Dalam C 11, anda boleh menggunakan std::is_base_of trait daripada pengepala untuk menyemak sama ada sesuatu jenis berasal daripada jenis lain. Berikut ialah contoh:

#include <type_traits>

template<typename T>
class observable_list {
    static_assert(std::is_base_of<list, T>::value, "T must inherit from list");

    // ...
};

Contoh ini mentakrifkan kelas templat observable_list yang hanya menerima jenis yang diwarisi daripada kelas senarai. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa templat yang mengekang secara berlebihan boleh mengehadkan fleksibilitinya dan mungkin tidak sesuai dalam C .

Pendekatan Alternatif: Kekangan Berasaskan Ciri

Pendekatan alternatif melibatkan mencipta ciri tersuai untuk mengekang jenis berdasarkan keperluan khusus. Sebagai contoh, anda mungkin mentakrifkan ciri untuk jenis dengan fungsi ahli atau typedef tertentu:

struct has_const_iterator {
    template<typename T>
    static bool test(...) { return false; }
};

template<typename T>
struct has_const_iterator<T, Void<typename T::const_iterator>> {
    static bool test(...) { return true; }
};

struct has_begin_end {
    template<typename T>
    static bool test(...) { return false; }

    template<typename T, typename Begin, typename End>
    static auto test(int) -> decltype(std::declval<const T&>().begin(), std::declval<const T&>().end()) { return true; }
};

Menggunakan ciri ini, anda boleh mengekang observable_list seperti berikut:

class observable_list {
    static_assert(has_const_iterator<T>::value, "Must have a const_iterator typedef");
    static_assert(has_begin_end<T>::value, "Must have begin and end member functions");

    // ...
};

Pendekatan ini memberikan lebih banyak fleksibiliti dan maklum balas ralat dengan membenarkan anda menentukan kekangan tertentu berdasarkan keperluan anda.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengehadkan Jenis Templat dalam C Seperti Kata Kunci `extends` Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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