Dalam C , hujah templat dihadkan kepada ungkapan malar kerana pengkompil perlu menentukan nilainya semasa penyusunan. Ungkapan malar ialah ungkapan yang boleh dinilai semata-mata berdasarkan maklumat yang tersedia pada masa penyusunan, tidak termasuk pembolehubah dan panggilan fungsi.
Dalam kod yang disediakan:
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
Argumen templat i bukan ungkapan malar kerana nilainya bergantung pada pembolehubah pembilang gelung, yang dinilai semasa masa jalan. Oleh itu, pengkompil tidak boleh menentukan nilai i pada masa penyusunan dan menimbulkan ralat.
Untuk mencapai matlamat anda tanpa mengubah suai antara muka perpustakaan, anda boleh menggunakan teknik yang dipanggil metaprogramming templat. Berikut ialah pendekatan:
<code class="cpp">template<int I = 1> void modify_loop() { modify<I>(); modify_loop<I + 1>(); } // Call the recursive function with the starting value modify_loop<>();</code>
Pendekatan ini bermula dengan fungsi templat modify_loop yang mempunyai nilai lalai yang saya tetapkan kepada 1. Di dalam fungsi, ia memanggil ubah suai dengan nilai semasa I dan kemudian secara rekursif memanggil dirinya dengan I bertambah. Rekursi berterusan sehingga saya mencapai nilai yang dikehendaki iaitu 10.
Untuk memanggil ubah suai di mana VAR ialah output pengiraan berfungsi, anda boleh menggunakan teknik yang dipanggil templat ungkapan. Berikut ialah contoh:
<code class="cpp">struct Func { template<typename T> T operator()(T arg) { return arg + 10; } }; constexpr auto VAR = Func()(); // Evaluate the function and store the result template<typename Value> void modify(Value arg) { ... } // Call modify with VAR as the argument modify(VAR);</code>
Dalam contoh ini, struct Func mentakrifkan objek fungsi yang menambah 10 pada hujahnya. Pembolehubah VAR menyimpan output fungsi ini, dan fungsi ubah suai menerima hujah templat dari sebarang jenis. Dengan membuat seketika ubah suai dengan VAR, anda dengan berkesan menghantar hasil fungsi sebagai hujah.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menggunakan Pembolehubah Gelung sebagai Argumen Templat dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!