Metaprogramming: Pemilihan Templat Berdasarkan Lebihan Fungsi
Dalam pengaturcaraan C, mentakrifkan fungsi templat secara bersyarat berdasarkan sifat jenis ialah teknik biasa. Walau bagaimanapun, dalam beberapa kes, mungkin sukar untuk mentakrifkan senario yang bertentangan, di mana templat dipilih berdasarkan ketiadaan fungsi tertentu.
Secara khusus, dalam contoh yang disediakan, matlamatnya adalah untuk menentukan templat rentetan fungsi yang memilih antara dua pelaksanaan:
Masalah timbul apabila cuba menyatakan keadaan yang terakhir. Percubaan berikut yang tidak berjaya untuk menggunakan templat enable_if bersarang untuk menyemak sama ada to_string tidak ditakrifkan:
template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
Untuk menyelesaikan isu ini, kami boleh menggunakan ciri jenis void_t Walter Brown:
template <typename...> using void_t = void;<p> Menggunakan ini, kita boleh menentukan sifat has_to_string sebagai berikut:</p> <pre class="brush:php;toolbar:false">template<typename T, typename = void> struct has_to_string : std::false_type { }; template<typename T> struct has_to_string<T, void_t<decltype(std::to_string(std::declval<T>()))> > : std::true_type { };
Kini, templat stringify boleh ditakrifkan menggunakan pengkhususan templat bersyarat berdasarkan sifat has_to_string:
template<typename T> enable_if_t<has_to_string<T>::value, string> stringify(T t){ return std::to_string(t); } template<typename T> enable_if_t<!has_to_string<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
Penyelesaian ini secara berkesan memilih pelaksanaan stringify yang sesuai berdasarkan sama ada std::to_string ditakrifkan untuk jenis yang diberikan.
Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Melaksanakan Pemilihan Templat Berdasarkan Ketiadaan Fungsi dalam Pemrograman Meta C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!