Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Ungkapan SFINAE (Kegagalan Penggantian Bukan Satu Ralat) berfungsi dalam C dan bagaimanakah ia boleh digunakan untuk mentakrifkan ciri dan menggunakan lebihan fungsi secara bersyarat?

Bagaimanakah Ungkapan SFINAE (Kegagalan Penggantian Bukan Satu Ralat) berfungsi dalam C dan bagaimanakah ia boleh digunakan untuk mentakrifkan ciri dan menggunakan lebihan fungsi secara bersyarat?

DDD
Lepaskan: 2024-11-11 04:49:03
asal
666 orang telah melayarinya

How does Expression SFINAE (Substitution Failure Is Not An Error) work in C   and how can it be used to define traits and conditionally apply function overloads?

Memahami Ungkapan SFINAE

Dalam konteks pengaturcaraan C, Ungkapan SFINAE (Kegagalan Penggantian Bukan Ralat) membolehkan anda menggunakan fungsi secara bersyarat lebihan beban berdasarkan kesahihan ungkapan dalam fungsi pengisytiharan.

Ekspresi SFINAE dalam Tindakan

Pertimbangkan contoh kod berikut:

Contoh 1:

template <int I> struct A {};

char xxx(int);
char xxx(float);

template <class T> A<sizeof(xxx((T)0))> f(T) {}
Salin selepas log masuk

Fungsi f() mengembalikan struct A dengan parameter yang saya tetapkan kepada saiz hasil memanggil xxx() dengan nilai tuangan parameter templat T kepada (T)0.

Contoh 2:

struct X {};
struct Y { Y(X) {} };

template <class T> auto f(T t1, T t2) -> decltype(t1 + t2); // #1
X f(Y, Y); // #2

X x1, x2;
X x3 = f(x1, x2); // deduction fails on #1 (cannot add X+X), calls #2
Salin selepas log masuk

Dalam contoh 2, f () lebihan fungsi membenarkan penambahan jenis berangka (#1) dan pembinaan Y daripada X (#2). Apabila fungsi f() dipanggil dengan x1 dan x2 (iaitu objek X), lebihan beban yang membina Y dipilih kerana lebihan beban pertama adalah tidak sah untuk objek X.

Kes Penggunaan Biasa: Trait Definisi

Ungkapan SFINAE biasanya digunakan dalam definisi sifat, di mana ia membolehkan anda mentakrifkan ciri berdasarkan kewujudan fungsi ahli tertentu dalam kelas. Contohnya:

struct has_member_begin_test {
  template <class U> static auto test(U* p) -> decltype(p->begin(), std::true_type());
  template <class> static auto test(...) -> std::false_type;
};

template <class T> struct has_member_begin
  : decltype(has_member_begin_test::test<T>(0)) {};
Salin selepas log masuk

Templat struct has_member_begin boleh digunakan untuk menyemak sama ada kelas mempunyai fungsi ahli begin(). Ia menggunakan Ungkapan SFINAE untuk menentukan sama ada ungkapan begin() mengembalikan jenis atau ungkapan yang sah dan mengembalikan std::true_type jika sah, sebaliknya std::false_type.

Nota Penting:

Ekspresi SFINAE ialah penambahan yang agak baru kepada bahasa C dan tidak semua penyusun menyokongnya sepenuhnya. Jika anda menghadapi sebarang masalah dengan Expression SFINAE dalam kod anda, adalah penting untuk mengesahkan bahawa versi pengkompil anda menyokongnya.

Atas ialah kandungan terperinci Bagaimanakah Ungkapan SFINAE (Kegagalan Penggantian Bukan Satu Ralat) berfungsi dalam C dan bagaimanakah ia boleh digunakan untuk mentakrifkan ciri dan menggunakan lebihan fungsi secara bersyarat?. 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