Memahami Sekatan Parameter Templat: Mengapa Nilai Terapung Dilarang
Dalam C , apabila mentakrifkan kelas generik dengan parameter templat, sekatan tertentu dikenakan. Satu sekatan sedemikian melibatkan ketidakupayaan untuk menggunakan nilai apungan sebagai parameter templat bukan jenis. Ini menjadi jelas apabila cuba menyusun kod seperti berikut:
template <class T, T defaultValue> class GenericClass { // ... }; int main() { GenericClass<float, 4.6f> gcFloat; // Error }
Mesej Ralat:
'float' is not a valid type for a template constant parameter Invalid type in declaration before ';' token
Penalaran:
Menurut piawaian C 11, argumen templat bukan jenis mesti mematuhi keperluan khusus. Untuk parameter templat bukan jenis jenis kamiran atau penghitungan, hanya ungkapan pemalar yang ditukar daripada jenis yang sama dibenarkan. Nilai apungan tidak memenuhi keperluan ini, kerana ia tidak boleh diwakili dengan tepat dalam ingatan.
Penjelasan Teknikal:
Menggunakan nilai apungan sebagai hujah templat boleh membawa kepada tingkah laku yang tidak konsisten. Sebagai contoh, pertimbangkan perkara berikut:
func<1/3.f>(); func<2/6.f>();
Walaupun kami berhasrat untuk memanggil fungsi yang sama dua kali, perwakilan titik terapung bagi kedua-dua pengiraan mungkin tidak sama. Ini boleh membawa kepada hasil yang berbeza, mengalahkan tujuan menggunakan hujah templat.
Pendekatan Alternatif:
Untuk mewakili nilai titik terapung sebagai hujah templat, pertimbangkan untuk menggunakan C 11's ungkapan malar (constexpr). Anda boleh mencipta ungkapan lanjutan yang mengira pengangka dan penyebut nilai apungan pada masa penyusunan dan menghantarnya sebagai hujah integer yang berasingan. Selain itu, tentukan ambang untuk memastikan nilai titik terapung yang berdekatan antara satu sama lain menghasilkan pengangka dan penyebut yang sama.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan Terapung sebagai Parameter Templat Bukan Jenis dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!