Dalam C , SFINAE (Kegagalan Penggantian Bukan Ralat) boleh digunakan untuk dayakan atau lumpuhkan pengkhususan templat secara bersyarat berdasarkan ciri jenis. Walau bagaimanapun, isu biasa timbul apabila SFINAE digunakan secara berbeza dalam jenis pengembalian templat dan parameter templat.
Pertimbangkan fungsi utama berikut:
int main() { foo(5); foo(3.4); }
Apabila SFINAE diletakkan dalam parameter templat, seperti yang ditunjukkan di bawah, ia gagal untuk menyusun dengan ralat:
template<typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type> auto foo(T) -> void { std::cout << "I'm an integrer!\n"; } template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type> auto foo(T) -> void { std::cout << "I'm a floating point number!\n"; }
Bagaimanapun, pelaksanaan ini berfungsi dengan betul:
template<typename T> auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type { std::cout << "I'm an integrer!\n"; } template<typename T> auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type { std::cout << "I'm a floating point number!\n"; }
Perbezaan terletak pada cara lebihan templat fungsi ditakrifkan dalam standard C (14.5.6.1). Templat terlebih beban adalah setara jika ia mempunyai nama fungsi yang sama, bilangan parameter yang sama dan jenis parameter yang sama. Walau bagaimanapun, hujah templat lalai tidak dipertimbangkan dalam perbandingan ini.
Dalam pelaksanaan yang rosak, syarat SFINAE disertakan sebagai hujah templat lalai, menghasilkan dua templat fungsi yang sama ditakrifkan dua kali. Ini mencetuskan ralat penyusunan.
Dalam pelaksanaan yang betul, keadaan SFINAE digunakan sebagai sebahagian daripada jenis pengembalian templat. Memandangkan ini melibatkan parameter templat yang merujuk ungkapan, kedua-dua fungsi mempunyai tandatangan yang berbeza dan dengan itu membolehkan SFINAE berfungsi seperti yang dimaksudkan.
Atas ialah kandungan terperinci SFINAE dalam C : Jenis Pulangan lwn. Jenis Parameter untuk Pengkhususan Templat Bersyarat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!