SFINAE membenarkan templat fungsi dinilai berdasarkan jenis parameter, yang sangat berguna untuk semakan keadaan dalam pengaturcaraan generik. Ia melakukan ini dengan menambah parameter yang mengembalikan batal: jika jenis masuk adalah sah, tiada ralat akan dilaporkan. Jika jenis yang dihantar adalah tidak sah, membuat instantiating templat fungsi akan gagal kerana pengkompil tidak tahu apa yang perlu dilakukan dengan parameter tidak sah. Dalam kes praktikal, SFINAE digunakan untuk menyemak sama ada jenis bekas menyokong fungsi ahli begin() dan end(), dengan itu menghalang ralat kompilasi yang disebabkan oleh bekas tidak menyokong fungsi ini.
Peranan SFINAE dalam pengaturcaraan generik C++
Istilah SFINAE (penggantian hujah klausa-untuk-fungsi) merujuk kepada teknik dalam bahasa pengaturcaraan C++ yang membenarkan templat fungsi secara langsung berdasarkan jenis parameternya Buat pertimbangan. Ini berguna untuk semakan bersyarat dalam kod generik tanpa menggunakan pernyataan bersyarat eksplisit.
Memahami SFINAE
SFINAE dilaksanakan dengan menambahkan parameter pengembalian kekosongan pada templat fungsi. Contohnya:
template <typename T> void check_type(T) {}
Jika T ialah jenis yang sah, memanggil check_type tidak akan menyebabkan ralat penyusunan kerana pengkompil boleh mencari borang yang sepadan. Walau bagaimanapun, jika T ialah jenis tidak sah, pengkompil akan cuba membuat instantiate check_type dan akan gagal kerana ia tidak tahu apa yang perlu dilakukan dengan hujah yang tidak sah.
Kes praktikal
Pertimbangkan kod berikut, yang mentakrifkan fungsi generik untuk mengira bilangan elemen dalam bekas:
template <typename T, typename U> int count_elements(const T& container, const U& element) { return std::count(container.begin(), container.end(), element); }
Jika bekas tidak menyokong fungsi ahli begin() dan end(), fungsi ini akan Tidak dapat menyusun. Untuk menyelesaikan masalah ini, kita boleh menggunakan SFINAE untuk menyemak jenis bekas:
template <typename T, typename U> void check_container(const T& container, const U& element) { static_assert(std::is_same<decltype(container.begin()), decltype(container.end())>::value, "Container must support begin() and end() methods"); } template <typename T, typename U> int count_elements(const T& container, const U& element) { check_container(container, element); // 检查容器类型 return std::count(container.begin(), container.end(), element); }
Sekarang, jika jenis kontena tidak menyokong fungsi ahli begin() dan end(), check_container akan menghasilkan ralat masa kompilasi, menghalang count_elements daripada dijadikan instantiated.
Atas ialah kandungan terperinci Bagaimana untuk memahami peranan SFINAE dalam pengaturcaraan generik C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!