Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Saya Tidak Boleh Menggunakan Pembolehubah Gelung sebagai Argumen Templat dalam C ?

Mengapakah Saya Tidak Boleh Menggunakan Pembolehubah Gelung sebagai Argumen Templat dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-10-31 01:09:02414semak imbas

 Why Can't I Use a Loop Variable as a Template Argument in C  ?

Mengapa Argumen Templat Mesti Dimalar

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.

Penjelasan Ralat

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.

Pendekatan Alternatif Tanpa Menukar API

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.

Memanggil Ubah Suai dengan Output Fungsi

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn