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
Susan Sarandonasal
2024-10-29 08:53:30705semak imbas

 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>

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>

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>

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:
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