Menggunakan Trik Templat untuk Mengesan Tandatangan Fungsi Ahli
Dalam pengaturcaraan berorientasikan objek, selalunya wajar untuk menentukan sama ada kelas mempunyai fungsi ahli dengan tandatangan yang diberikan. Keupayaan ini boleh berguna dalam pelbagai senario, seperti mencetuskan gelagat tersuai untuk kelas yang tidak mempunyai fungsi tertentu atau memudahkan panggilan fungsi dinamik.
Satu pendekatan untuk menyelesaikan masalah ini ialah memanfaatkan pengaturcaraan meta templat C. Helah templat membenarkan pembangun memanipulasi jenis pada masa kompilasi, membolehkan penciptaan semakan masa kompilasi yang canggih.
Pertimbangkan fungsi templat berikut:
template<typename> struct has_serialize { static constexpr bool value = false; }; template<typename C, typename Ret, typename... Args> struct has_serialize<C, Ret(Args...)> { // Perform compile-time function call checking // ... };
Templat has_serialize pada mulanya ditakrifkan dengan nilai pemalar statik ditetapkan kepada palsu. Apabila dikhususkan dengan tandatangan kelas dan fungsi tertentu, pengkhususan has_serialize cuba melakukan panggilan masa kompilasi kepada fungsi ahli. Jika panggilan berjaya dengan jenis pulangan yang dijangkakan, nilai ditetapkan kepada benar, menunjukkan kehadiran fungsi ahli. Jika tidak, nilai kekal palsu.
Untuk menggunakan helah templat ini, nyatakan kelas dan tandatangan fungsi yang ingin anda semak:
struct MyClass { int serialize(const std::string&); }; bool hasSerialize = has_serialize<MyClass, int(const std::string&)>::value;
Jika hasSerialize benar, MyClass mempunyai fungsi ahli bersiri dengan tandatangan yang ditetapkan. Jika tidak, ia tidak.
Perhatikan bahawa teknik ini boleh mengesan fungsi walaupun ia diwarisi daripada kelas asas. Ini tidak seperti penyelesaian yang dicadangkan dalam jawapan yang diterima, yang mungkin gagal mengenal pasti fungsi yang diwarisi.
Atas ialah kandungan terperinci Bagaimana C Template Metaprogramming Boleh Mengesan Tandatangan Fungsi Ahli?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!