Dalam C , argumen templat mestilah ungkapan malar. Ini bermakna bahawa nilai mereka mesti diketahui pada masa penyusunan. Pengkompil tidak boleh menilai pembolehubah bukan pemalar dalam konteks ini.
Pertimbangkan kod:
<code class="cpp">template <int a> void modify(){}</code>
Untuk menghantar pembolehubah bukan pemalar sebagai hujah templat, kami mungkin menulis:
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
Walau bagaimanapun, ini mencetuskan ralat kerana pengkompil tidak dapat menentukan nilai i pada masa penyusunan. Badan gelung boleh dilaksanakan berbilang kali, menukar nilai i.
Daripada menghantar pembolehubah tidak tetap secara langsung, kami boleh menggunakan pengkhususan templat untuk melaksanakan panggilan berulang:
<code class="cpp">#include <iostream> template<> void modify<0>() { std::cout << "modify<0>" << std::endl; } template<> void modify<1>() { std::cout << "modify<1>" << std::endl; } // ... template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; modify<i+1>(); } int main() { modify<0>(); }</code>
Untuk memanggil ubah suai dengan nilai yang tidak diketahui pada masa penyusunan, kita boleh menggunakan teknik yang dipanggil metaprogramming templat. Berikut ialah contoh ringkas:
<code class="cpp">#include <tuple> template <std::tuple<int...>> struct TupleSize; template <int... Args> struct TupleSize<std::tuple<Args...>> { static const int value = sizeof...(Args); }; template <int N> void callModify(int i) { if constexpr (i < N) { modify<i>(); callModify<N>(i+1); } } int main() { int n = 10; callModify<TupleSize<std::make_tuple(1,2,3,4,5,6,7,8,9,10)>::value>(0); }</code>
Dalam contoh ini, callModify mengambil parameter N iaitu saiz tuple yang mengandungi julat nilai yang dikehendaki untuk i. Fungsi ini menggunakan metaprogram rekursif untuk menjana panggilan untuk mengubah suai sehingga saiz N yang ditentukan.
Atas ialah kandungan terperinci Mengapa Pembolehubah Tidak Malar Tidak Boleh Digunakan sebagai Argumen Templat dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!