Rumah > pembangunan bahagian belakang > C++ > Mengapa saya tidak boleh menggunakan pembolehubah bukan malar sebagai hujah templat dalam C ?

Mengapa saya tidak boleh menggunakan pembolehubah bukan malar sebagai hujah templat dalam C ?

Susan Sarandon
Lepaskan: 2024-10-29 08:53:30
asal
719 orang telah melayarinya

 Why can't I use a non-constant variable as a template argument in C  ?

Teka-teki Argumen Templat Bukan Malar

Apabila cuba menghantar pembolehubah bukan pemalar sebagai hujah templat, seperti i dalam coretan kod berikut, pengkompil mengeluarkan ralat:

<code class="cpp">template <int a>
void modify() {}

for (int i = 0; i < 10; i++) {
    modify<i>(); // error: 'i' cannot appear in constant-expression
}</code>
Salin selepas log masuk

Sebab Ralat:

Templat dikembangkan semasa penyusunan, yang memerlukan hujahnya dinilai pada masa penyusunan. Memandangkan i diubah suai dalam gelung, pengkompil tidak boleh menentukan nilainya pada masa penyusunan, membawa kepada ralat.

Pelaksanaan Alternatif:

Untuk mencapai lelaran yang diingini tanpa mengubah antara muka API, pertimbangkan untuk melaksanakan perkara berikut:

<code class="cpp">#include <iostream>

template<int i>
void modify()
{ std::cout << "modify<" << i << ">" << std::endl; }

template<int x, int to>
struct static_for
{
    void operator()() 
    {  modify<x>();  static_for<x+1,to>()(); }
};

template<int to>
struct static_for<to,to>
{
    void operator()() 
    {}
};


int main()
{
    static_for<0,10>()();
}</code>
Salin selepas log masuk

Versi ini menggunakan rekursi untuk meniru lelaran. Dengan membuat seketika fungsi templat khusus untuk setiap nilai (cth., ubah suai<0>, ubah suai<1>, dsb.), kod tersebut mensimulasikan kelakuan gelung daripada i=0 hingga i=9.

Bukan -Resolusi Argumen Templat Malar:

Untuk memanggil ubah suai dengan argumen pembolehubah VAR (ditentukan oleh pengiraan berfungsi), pertimbangkan untuk menggunakan fungsi templat dengan parameter variadik, seperti berikut:

<code class="cpp">template <typename T>
void modify(const T& x)
{ std::cout << "modify(" << x << ")" << std::endl; }

int main()
{
    auto VAR = ...; // computed from some functional process
    modify(VAR);
}</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa saya tidak boleh menggunakan pembolehubah bukan malar sebagai hujah templat dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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