Rumah >pembangunan bahagian belakang >C++ >Mengapa Pembolehubah Tidak Malar Tidak Boleh Digunakan sebagai Argumen Templat dalam C ?

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

Patricia Arquette
Patricia Arquetteasal
2024-10-29 18:42:00418semak imbas

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>

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

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

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>

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>

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!

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