Mengapa Pembolehubah Tidak Malar Tidak Boleh Digunakan sebagai Argumen Templat dalam C ?

Patricia Arquette
Lepaskan: 2024-10-29 18:42:00
asal
276 orang telah melayarinya

Why Can't Non-Constant Variables Be Used as Template Arguments in C  ?

Mengapa Pembolehubah Bukan Malar Tidak Boleh Dilalui sebagai Argumen Templat?

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

Untuk menghantar pembolehubah bukan pemalar sebagai hujah templat, kami mungkin menulis:

<code class="cpp">for(int i = 0; i < 10; i++) {
    modify<i>();
}</code>
Salin selepas log masuk

Walau bagaimanapun, ini mencetuskan ralat kerana pengkompil tidak dapat menentukan nilai i pada masa penyusunan. Badan gelung boleh dilaksanakan berbilang kali, menukar nilai i.

Mencapai Objektif Tanpa Mengubah Suai API

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

Panggilan Ubah Suai dengan Nilai Dinamik

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!