Pengkhususan Separa Templat Fungsi: Mengapa Tidak?
Adalah diketahui umum bahawa spesifikasi bahasa C melarang pengkhususan separa templat fungsi. Keputusan ini telah membingungkan ramai pembangun, yang mempersoalkan kegunaan dan rasionalnya.
Spesifikasi bahasa melarang pengkhususan separa templat fungsi kerana kesilapan. Fleksibiliti yang ditawarkan oleh pengkhususan separa boleh dicapai melalui teknik alternatif, seperti mentakrifkan fungsi sebagai ahli statik kelas.
Sebagai contoh, pertimbangkan kod berikut:
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!
Sementara pengkhususan separa bagi f tidak dibenarkan, kita boleh mencapai kesan yang sama dengan mentakrifkan fungsi sebagai ahli statik sesuatu class:
void say( char const 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 berkelakuan serupa dengan pengkhususan separa templat fungsi, menyediakan mekanisme untuk mentakrifkan pelaksanaan khusus untuk gabungan hujah tertentu.
Atas ialah kandungan terperinci Mengapa Pengkhususan Separa Templat Fungsi Dilarang dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!