Bagaimanakah kita boleh menulis fungsi generik dalam C yang menerima fungsi templat sebagai hujah?

Mary-Kate Olsen
Lepaskan: 2024-11-01 20:46:29
asal
196 orang telah melayarinya

How can we write a generic function in C   that accepts template functions as arguments?

Fungsi Templat sebagai Argumen Templat: Mentakrifkan Fungsi Generik dengan Parameter Templat Templat

Cabaran mentakrifkan fungsi generik dalam C boleh dihadapi apabila fungsi dalaman itu sendiri generik . Artikel ini meneroka penyelesaian menggunakan parameter templat templat untuk mengatasi halangan ini.

Pertimbangkan coretan kod berikut yang menggambarkan masalah:

<code class="cpp">template<typename T>
void a(T t) {
   // do something
}

template<typename T>
void b(T t) {
   // something else
}

template< ...param... > // ???
void function() {
    param<SomeType>(someobj);
    param<AnotherType>(someotherobj);
}

void test() {
    function<a>();
    function<b>();
}</code>
Salin selepas log masuk

Kesukaran timbul dalam menentukan cara mentakrifkan templat fungsi dengan betul . Untuk menyelesaikan masalah ini, kami menggunakan teknik yang dikenali sebagai "parameter templat templat."

Parameter Templat Templat

Parameter templat templat membolehkan kami menghantar fungsi templat sebagai hujah kepada templat lain. Ini memberikan fleksibiliti untuk mencipta fungsi generik yang beroperasi pada set fungsi templat tertentu.

Walau bagaimanapun, terdapat tangkapan: kami tidak boleh meneruskan fungsi templat secara langsung sebagai jenis. Sebaliknya, kita mesti menggunakan penyelesaian dengan struktur dummy.

Penyelesaian Menggunakan Struktur Dummy

Kod berikut menunjukkan penyelesaian:

<code class="cpp">template <typename T>
struct a {

    static void foo (T = T ())
    {
    }

};

template <typename T>
struct b {

    static void foo (T = T ())
    {
    }

};

struct SomeObj {};
struct SomeOtherObj {};

template <template <typename P> class T>
void function ()
{
    T<SomeObj>::foo ();
    T<SomeOtherObj>::foo ();
}

int main ()
{
    function<a>();
    function<b>();
}</code>
Salin selepas log masuk

Struktur dummy a dan b berkhidmat sebagai ruang letak untuk fungsi templat. Mereka menyediakan kaedah foo yang tidak melakukan apa-apa, terutamanya untuk memenuhi keperluan sintaks.

Templat fungsi menerima parameter templat templat T, yang menentukan jenis fungsi templat yang akan dilaksanakan. Ia kemudian memanggil foo untuk dua jenis objek berbeza, SomeObj dan SomeOtherObj.

Dengan menggunakan pendekatan ini, kita boleh menentukan fungsi generik yang beroperasi pada set fungsi templat dengan cara yang fleksibel dan selamat jenis.

Atas ialah kandungan terperinci Bagaimanakah kita boleh menulis fungsi generik dalam C yang menerima fungsi templat sebagai hujah?. 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!