Rumah > Artikel > pembangunan bahagian belakang > Templat fungsi C++ digabungkan dengan SFINAE (jenis terbitan gagal sah)?
Templat Fungsi Digunakan bersama SFINAE untuk mencipta fungsi generik dan melaraskan gelagat fungsi berdasarkan jenis parameter templat. SFINAE membolehkan kami mengawal ketersediaan fungsi berdasarkan sama ada potongan jenis parameter templat gagal. Apabila digunakan bersama, templat fungsi boleh memperhalusi gelagat berdasarkan kekangan jenis, seperti membezakan antara jenis integer dan bukan integer, tidak termasuk jenis boolean, dsb., menghasilkan kod yang fleksibel dan selamat jenis.
Pengenalan
Templat fungsi C++ membolehkan kami mencipta fungsi generik yang berfungsi pada pelbagai jenis. Walau bagaimanapun, dalam beberapa kes kami mungkin ingin memperhalusi tingkah laku fungsi berdasarkan jenis parameter templat. Di sinilah SFINAE (Type Deduction Failed Efficient) masuk.
SFINAE
SFINAE ialah teknik yang membolehkan kita menentukan ketersediaan fungsi berdasarkan kehadiran atau ketiadaan jenis parameter templat. Jika hujah templat tidak dapat disimpulkan, pengkompil akan melaporkan kegagalan derivasi, yang boleh kita gunakan untuk mengawal ketersediaan fungsi.
Gabungan penggunaan templat fungsi C++ dan SFINAE
Kami boleh melanjutkan fungsi templat fungsi dengan menggunakan SFINAE. Mari lihat contoh:
template <typename T> typename std::enable_if<std::is_integral<T>::value, void>::type func(T x) { // Integral type-specific implementation } template <typename T> typename std::enable_if<!std::is_integral<T>::value, void>::type func(T x) { // Non-integral type-specific implementation }
Dalam contoh ini, kami mencipta templat fungsi func
dan memilih tandatangan fungsi yang berbeza berdasarkan jenis parameter templat T
. Menggunakan std::enable_if
, kami mencipta dua fungsi bersarang yang hanya tersedia apabila kekangan jenis tertentu dipenuhi. Untuk jenis integer, fungsi pertama akan dipanggil, dan untuk jenis bukan integer, fungsi kedua akan dipanggil. func
,根据模板参数 T
的类型选择不同的函数签名。使用 std::enable_if
,我们创建两个嵌套函数,它们仅在满足特定类型约束时可用。对于整数类型,将调用第一个函数,对于非整数类型,将调用第二个函数。
实战案例
以下是一个 C++ 函数模板与 SFINAE 结合使用的实际案例:
// 实现求平方和的函数模板 template <typename T> auto sum_of_squares(const std::vector<T>& v) { typename std::enable_if<!std::is_same<T, bool>::value, decltype(v[0]*v[0])>::type result = T{}; for (const auto& elem : v) result += elem * elem; return result; }
在这个案例中,我们创建了一个函数模板 sum_of_squares
Kes praktikal
Berikut ialah kes praktikal menggunakan templat fungsi C++ dengan SFINAE:rrreee
Dalam kes ini, kami mencipta templat fungsiAtas ialah kandungan terperinci Templat fungsi C++ digabungkan dengan SFINAE (jenis terbitan gagal sah)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!