Rumah >pembangunan bahagian belakang >C++ >Mengapa saya tidak boleh menggunakan pembolehubah bukan malar sebagai hujah templat dalam C ?
Apabila cuba menghantar pembolehubah bukan pemalar sebagai hujah templat, seperti i dalam coretan kod berikut, pengkompil mengeluarkan ralat:
<code class="cpp">template <int a> void modify() {} for (int i = 0; i < 10; i++) { modify<i>(); // error: 'i' cannot appear in constant-expression }</code>
Sebab Ralat:
Templat dikembangkan semasa penyusunan, yang memerlukan hujahnya dinilai pada masa penyusunan. Memandangkan i diubah suai dalam gelung, pengkompil tidak boleh menentukan nilainya pada masa penyusunan, membawa kepada ralat.
Pelaksanaan Alternatif:
Untuk mencapai lelaran yang diingini tanpa mengubah antara muka API, pertimbangkan untuk melaksanakan perkara berikut:
<code class="cpp">#include <iostream> template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; } template<int x, int to> struct static_for { void operator()() { modify<x>(); static_for<x+1,to>()(); } }; template<int to> struct static_for<to,to> { void operator()() {} }; int main() { static_for<0,10>()(); }</code>
Versi ini menggunakan rekursi untuk meniru lelaran. Dengan membuat seketika fungsi templat khusus untuk setiap nilai (cth., ubah suai<0>, ubah suai<1>, dsb.), kod tersebut mensimulasikan kelakuan gelung daripada i=0 hingga i=9.
Bukan -Resolusi Argumen Templat Malar:
Untuk memanggil ubah suai dengan argumen pembolehubah VAR (ditentukan oleh pengiraan berfungsi), pertimbangkan untuk menggunakan fungsi templat dengan parameter variadik, seperti berikut:
<code class="cpp">template <typename T> void modify(const T& x) { std::cout << "modify(" << x << ")" << std::endl; } int main() { auto VAR = ...; // computed from some functional process modify(VAR); }</code>
Atas ialah kandungan terperinci Mengapa saya tidak boleh menggunakan pembolehubah bukan malar sebagai hujah templat dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!