Anomali Pengkhususan Separa: Mendedahkan Lebihan Templat Fungsi
Dalam bidang pengaturcaraan C, pengkhususan separa templat fungsi secara amnya dilarang, membenarkan hanya penuh pengkhususan. Walau bagaimanapun, pemerhatian yang menarik telah muncul mengenai coretan kod yang mungkin kelihatan mencadangkan sebaliknya.
Pertimbangkan kod berikut:
#include <iostream> using std::cin; using std::cout; using std::endl; template <typename T1, typename T2> inline T1 max(T1 const& a, T2 const& b) { return a < b ? b : a; } template <typename T> inline T const& max(T const& a, T const& b) { return 10; } int main() { cout << max(4, 4.2) << endl; cout << max(5, 5) << endl; int z; cin >> z; }
Pada pandangan pertama, nampaknya fungsi maks kedua templat ialah pengkhususan separa daripada yang pertama, kerana kedua-dua parameter templatnya mewakili jenis T yang sama. Walau bagaimanapun, andaian ini adalah tidak betul.
Pada hakikatnya, kod ini menunjukkan templat fungsi yang berlebihan, bukan pengkhususan separa. Kelebihan templat fungsi membenarkan berbilang templat fungsi dengan nama yang sama tetapi jenis parameter yang berbeza. Dalam kes ini, dua templat fungsi maks mempunyai tandatangan yang berbeza: satu mengambil hujah daripada jenis yang berbeza, manakala satu lagi mengambil hujah jenis yang sama.
Pengkhususan separa, sebaliknya, memerlukan penentuan versi tertentu daripada templat fungsi maks untuk set hujah templat tertentu, seperti max
Adalah penting untuk ambil perhatian bahawa sesetengah penyusun mungkin menawarkan sambungan yang membenarkan pengkhususan separa templat fungsi. Walau bagaimanapun, sambungan ini menghasilkan kod yang tidak mudah alih merentas semua pengkompil dan platform.
Oleh itu, adalah penting untuk memahami perbezaan antara beban templat fungsi dan pengkhususan separa untuk memastikan ketepatan dan kemudahalihan kod dalam pembangunan C.
Atas ialah kandungan terperinci Adakah C Membenarkan Pengkhususan Separa Templat Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!