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
DDDasal
2024-12-19 12:44:11856semak imbas

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;

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!

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