Rumah >pembangunan bahagian belakang >C++ >Bolehkah Fungsi Templat Diluluskan sebagai Argumen Templat dalam C?

Bolehkah Fungsi Templat Diluluskan sebagai Argumen Templat dalam C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 18:44:02439semak imbas

Can Template Functions Be Passed as Template Arguments in C  ?

Fungsi Templat sebagai Argumen Templat

Dalam C , pengaturcaraan generik boleh dicapai melalui penunjuk fungsi atau templat. Walaupun templat memastikan panggilan fungsi sebaris, ia menghadapi had apabila berurusan dengan fungsi generik itu sendiri.

Pernyataan Masalah

Pertimbangkan kod berikut:

<code class="cpp">void a(int) {
    // do something
}
void b(int) {
    // something else
}

template<void (*param)(int) >
void function() {
    param(123);
    param(456);
}</code>

Walaupun fungsi templat ini memudahkan pengulangan antara fungsi1 dan fungsi2, ia menjadi bermasalah apabila a dan b adalah generik sendiri:

<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);
}</code>

Penyelesaian: Parameter Templat Templat

Untuk menentukan fungsi generik dengan fungsi generik a dan b, kita perlu menggunakan parameter templat templat. Walau bagaimanapun, melepasi fungsi ini sebagai jenis secara langsung tidak mungkin. Oleh itu, kami menggunakan penyelesaian dengan struktur dummy:

<code class="cpp">template<typename T>
struct a {
    static void foo(T = T()) {}
};

template<typename T>
struct b {
    static void foo(T = T()) {}
};

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

Dengan menentukan parameter templat templat sebagai struktur tiruan a dan b, kami boleh membuat instantiate fungsi templat dan memanggil kaedah foo generik dalam fungsi.

Atas ialah kandungan terperinci Bolehkah Fungsi Templat Diluluskan 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