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
179 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!

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