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!