Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengehadkan Jenis Templat dalam C kepada Warisan atau Fungsi Tertentu?

Bagaimanakah Saya Boleh Mengehadkan Jenis Templat dalam C kepada Warisan atau Fungsi Tertentu?

Barbara Streisand
Lepaskan: 2024-12-31 04:58:09
asal
207 orang telah melayarinya

How Can I Restrict Template Types in C   to Specific Inheritance or Functionality?

Cara Mengekang Templat untuk Hanya Menerima Jenis Khusus dalam C

Di Java, kelas generik boleh ditakrifkan untuk menerima hanya jenis yang mewarisi daripada kelas tertentu:

public class ObservableList<T extends List> {
    /* ... */
}
Salin selepas log masuk

Ini dicapai menggunakan lanjutan kata kunci.

Setara dalam C

Tidak seperti Java, C tidak mempunyai setara langsung dengan kata kunci lanjutan untuk mengekang templat. Walau bagaimanapun, terdapat cara untuk mencapai kekangan yang sama menggunakan ciri jenis std::is_base_of dalam C 11:

#include <type_traits>

template<typename T>
class observable_list {
    static_assert(std::is_base_of<list, T>::value, "T must inherit from list");
    // code here..
};
Salin selepas log masuk

Pendekatan Alternatif

Sementara pendekatan ini berfungsi, ia memisahkan diri daripada prinsip reka bentuk C tipikal. Sebaliknya, mungkin lebih sesuai untuk menggunakan kekangan berasaskan ciri:

#include <type_traits>

template<typename T>
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");
    // code here...
};

template<typename T>
struct has_const_iterator : std::false_type {};

template<typename T>
struct has_const_iterator<T, Void<typename T::const_iterator>> : std::true_type {};

struct has_begin_end_impl {
    template<typename T, typename Begin = decltype(std::declval<const T&>().begin()),
                         typename End   = decltype(std::declval<const T&>().end())>
    static std::true_type test(int);
    template<typename... Args>
    static std::false_type test(...);
};

template<typename T>
struct has_begin_end : decltype(has_begin_end_impl::test<T>(0)) {};

using Void = typename void_<>::type;

template<typename... Args>
struct void_ {
    using type = void;
};
Salin selepas log masuk

Pendekatan ini mentakrifkan ciri tersuai untuk menyemak keperluan khusus (cth., kewujudan const_iterator, fungsi mula dan tamat). Ia memberikan lebih fleksibiliti dan membenarkan mesej ralat tersuai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengehadkan Jenis Templat dalam C kepada Warisan atau Fungsi Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan