Memahami Potongan Argumen Templat dalam Templat Fungsi
Pertimbangkan kod berikut di mana templat fungsi cal_size digunakan untuk mengira dan mencetak saiz tatasusunan :
#include <iostream> template <typename T, size_t N> void cal_size(T (&a)[N]) { std::cout << "size of array is: " << N << std::endl; }
Apabila program dijalankan, ia mencetak saiz yang betul untuk kedua-duanya tatasusunan:
int a[] = {1,2,3,4,5,6}; int b[] = {1}; cal_size(a); cal_size(b);
Jadi, bagaimanakah fungsi templat cal_size secara automatik menyimpulkan saiz tatasusunan yang diluluskan, walaupun saiznya tidak diluluskan secara eksplisit sebagai hujah?
Jawapannya terletak pada konsep potongan hujah templat dalam C . Begini caranya:
Semasa penyusunan, pengkompil melakukan potongan hujah templat untuk menentukan jenis T dan nilai N berdasarkan jenis sebenar hujah yang dihantar kepada fungsi templat. Dalam kes ini, apabila cal_size dipanggil dengan argumen a, pengkompil menyimpulkan T sebagai int dan N sebagai 6, mencipta fungsi khusus cal_size_int_6 pada masa penyusunan:
void cal_size_int_6(int (&a)[6]) { std::cout << "size of array is: " << 6 << std::endl; }
Begitu juga, untuk hujah b, pengkompil menyimpulkan T sebagai int dan N sebagai 1, menghasilkan pengkhususan cal_size_int_1:
void cal_size_int_1(int (&a)[1]) { std::cout << "size of array is: " << 1 << std::endl; }
Oleh itu, templat cal_size asal berkesan mencipta dua pengkhususan fungsi berasingan, masing-masing dengan nilai T dan N berkod kerasnya sendiri. Proses ini memastikan saiz tatasusunan yang betul dicetak untuk setiap panggilan ke cal_size.
Atas ialah kandungan terperinci Bagaimanakah Potongan Argumen Templat C Menentukan Saiz Tatasusunan dalam Templat Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!