Nota tentang penggunaan templat fungsi C++: Nyatakan secara eksplisit jenis parameter templat. Manfaatkan keupayaan inferens jenis. Gunakan pengkhususan templat untuk mengendalikan jenis tertentu. Tetapkan parameter jenis lalai. Beri perhatian kepada keutamaan lebihan fungsi bukan templat.
notes menggunakan templat fungsi C ++ apabila menggunakan templat fungsi C ++, anda perlu memberi perhatian kepada titik berikut:
1. pengisytiharan fungsi Apabila ditinggalkan, pengkompil cuba membuat kesimpulan jenis daripada panggilan fungsi. Walau bagaimanapun, ini boleh menyebabkan ralat pengkompil atau tingkah laku yang tidak dijangka. Oleh itu, adalah disyorkan untuk sentiasa menentukan jenis parameter templat secara eksplisit. Contohnya:
templatevoid foo(T x) { // ... }
2. Jenis inferens
C++11 memperkenalkan fungsi jenis inferens, membenarkan jenis parameter templat disimpulkan daripada parameter fungsi. Jika fungsi hanya mempunyai satu parameter templat, anda boleh menggunakan kata kunci
templatevoid foo(auto x) { // ... }
3 Pengkhususan
Apabila gelagat fungsi templat perlu berbeza pada beberapa tertentu. jenis , anda boleh menggunakan pengkhususan templat. Pengkhususan dicapai dengan mengisytiharkan pelaksanaan fungsi yang berasingan untuk jenis tertentu:auto
关键字进行类型推导:
templatevoid foo(T x) { // 默认实现 } template <> void foo(int x) { // 特化实现 }
3. 特化
当模板函数的行为在某些特定的类型上需要不同时,可以使用模板特化。特化通过为特定类型声明单独的函数实现来实现:
templatevoid foo(T x) { // ... }
4. 默认类型参数
默认类型参数允许在函数声明中指定默认模板参数类型。这使调用者可以在不显式指定类型参数的情况下使用函数:
templateT sum_array(T arr[], int size) { T sum = 0; for (int i = 0; i < size; ++i) { sum += arr[i]; } return sum; } int main() { int arr[] = {1, 2, 3, 4, 5}; double arr2[] = {1.2, 2.3, 3.4, 4.5, 5.6}; std::cout << sum_array(arr, 5) << std::endl; // 输出:15 std::cout << sum_array(arr2, 5) << std::endl; // 输出:17 return 0; }
5. 非模板函数重载
如果函数模板与非模板函数的签名相同,则非模板函数将被优先匹配。为了避免这种情况,可以使用enable_if
或SFINAE
rrreee
4 Parameter jenis lalai
Parameter jenis lalai membenarkan jenis parameter templat lalai ditentukan dalam pengisytiharan fungsi. Ini membenarkan pemanggil menggunakan fungsi tanpa menyatakan parameter jenis secara jelas:rrreee
5. Fungsi bukan templat berlebihan Jika templat fungsi mempunyai tandatangan yang sama dengan fungsi bukan templat, fungsi bukan templat akan menjadi pilihan padanan . Untuk mengelakkan ini, anda boleh menggunakan teknikenable_if
atau
SFINAE
(nama palsu-benar dalam ungkapan). Kes praktikalBerikut ialah contoh penggunaan templat fungsi untuk mengira jumlah unsur bagi sebarang jenis tatasusunan: rrreee
Atas ialah kandungan terperinci Apakah perkara utama yang perlu diberi perhatian apabila menggunakan templat fungsi C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!