Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-10-31 01:09:02
asal
516 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan