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>
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 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.
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>
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!