Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah SFINAE Berbeza Apabila Digunakan untuk Mengembalikan Jenis Berbanding Parameter Templat?

Bagaimanakah SFINAE Berbeza Apabila Digunakan untuk Mengembalikan Jenis Berbanding Parameter Templat?

DDD
Lepaskan: 2024-12-19 12:44:11
asal
848 orang telah melayarinya

How Does SFINAE Differ When Applied to Return Types Versus Template Parameters?

Kegunaan SFINAE dalam Jenis Pulangan lwn. Parameter Templat

Dalam pengaturcaraan C, SFINAE (Kegagalan Penggantian Bukan Satu Ralat) ialah teknik untuk templat metaprogramming. SFINAE membenarkan anda menggunakan parameter templat untuk menentukan kekangan pada jenis argumen yang boleh dihantar kepada fungsi atau kelas templat.

Dalam contoh anda, anda mempunyai dua pelaksanaan fungsi bernama foo:

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void;

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void;
Salin selepas log masuk

Pelaksanaan pertama menggunakan SFINAE dengan metafungsi std::enable_if dalam parameter templat. Ini bermakna fungsi templat foo hanya boleh dipanggil dengan jenis yang memenuhi syarat std::is_integral::value.

Pelaksanaan kedua, walau bagaimanapun, menggunakan SFINAE dengan std::enable_if dalam pemulangan jenis fungsi templat. Dalam kes ini, fungsi foo boleh dipanggil dengan mana-mana jenis, tetapi jenis pulangan akan menjadi jenis terbatal hanya jika T memenuhi syarat std::is_integral::value.

Dalam contoh anda, pelaksanaan pertama gagal untuk disusun kerana hujah templat lalai untuk parameter templat kedua tidak diambil kira semasa menentukan sama ada templat telah digunakan untuk parameter templat pertama. Oleh itu, pengkompil menganggap anda cuba mengisytiharkan semula templat fungsi yang sama dua kali, mengakibatkan ralat.

Sebaliknya, pelaksanaan kedua berfungsi kerana nama taip ungkapan std::enable_if::value>::type dinilai semasa instantiasi templat dan digunakan sebagai jenis pemulangan fungsi. Memandangkan ungkapan ini adalah sebahagian daripada tandatangan fungsi templat, ia membolehkan SFINAE membezakan antara pengkhususan templat yang berbeza berdasarkan nilai T.

Atas ialah kandungan terperinci Bagaimanakah SFINAE Berbeza Apabila Digunakan untuk Mengembalikan Jenis Berbanding Parameter Templat?. 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