Mengapakah pengkhususan separa templat fungsi dilarang dalam bahasa C? Walaupun templat utama dan pengkhususan khusus dibenarkan, pengkhususan separa yang mengekang sebahagian daripada jenis dalam parameter templat tidak dibenarkan.
Spesifikasi bahasa C secara jelas tidak membenarkan pengkhususan separa kerana ia dianggap tidak perlu. Kefungsian yang dicapai oleh pengkhususan separa boleh direplikasi menggunakan kaedah alternatif, seperti melampirkan tika fungsi individu dalam kelas atau ruang nama atau menggunakan blok kod bersyarat untuk memilih templat secara selektif.
Pertimbangkan contoh berikut, di mana pengkhususan separa bukan dibenarkan:
template<typename T, typename U> void f() {} //allowed! template<> void f<int, char>() {} //allowed! template<typename T> void f<char, T>() {} //not allowed! template<typename T> void f<T, int>() {} //not allowed!
Tingkah laku ini mungkin kelihatan berlawanan dengan intuitif, tetapi rasionalnya jelas. Pengkhususan separa boleh mencipta kekaburan semasa instantiasi templat dan boleh membawa kepada tingkah laku yang tidak diingini. Dengan menguatkuasakan pemisahan yang ketat antara templat utama dan pengkhususan khusus, bahasa memastikan instantiasi templat yang boleh diramal dan ditakrifkan dengan baik.
Walau bagaimanapun, ini tidak bermakna pengkhususan separa tidak berguna sama sekali. Dengan menggabungkan fungsi dalam kelas atau ruang nama, anda boleh mencapai kesan serupa dengan berkesan:
#include <iostream> using namespace std; void say(const char s[]) { std::cout << s << std::endl; } namespace detail { template< class T, class U > struct F { static void impl() { say("1. primary template"); } }; template<> struct F<int, char> { static void impl() { say("2. <int, char> explicit specialization"); } }; template< class T > struct F< char, T > { static void impl() { say("3. <char, T> partial specialization"); } }; template< class T > struct F< T, int > { static void impl() { say("4. <T, int> partial specialization"); } }; } // namespace detail template< class T, class U > void f() { detail::F<T, U>::impl(); } int main() { f<char const*, double>(); // 1 f<int, char>(); // 2 f<char, double>(); // 3 f<double, int>(); // 4 }
Kod ini menunjukkan cara menggunakan ahli kelas untuk meniru pengkhususan separa. Setiap instantiasi khusus fungsi disertakan dalam fungsi ahli statiknya sendiri, memberikan tahap pengkhususan yang sama tanpa melanggar sekatan bahasa. Dengan menggunakan penyelesaian ini, anda boleh mencapai kefungsian pengkhususan separa yang diingini dengan berkesan sambil mematuhi konvensyen bahasa yang ditetapkan.
Atas ialah kandungan terperinci Mengapakah Pengkhususan Separa Templat Fungsi Tidak Dibenarkan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!