Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah SFINAE Berbeza Apabila Digunakan untuk Mengembalikan Jenis Berbanding Parameter Templat?
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
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
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
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!