Pertembungan Argumen Templat: Mengapa enable_if_t Gagal dalam Takrifan
Dalam pengaturcaraan templat, bukan sesuatu yang luar biasa untuk menghadapi situasi di mana kita perlu mendayakan secara bersyarat atau lumpuhkan fungsi templat berdasarkan keadaan tertentu. Dalam kes sedemikian, templat std::enable_if sering digunakan untuk mencapai ini. Walau bagaimanapun, percubaan baru-baru ini untuk menggunakan sintaks std::enable_if_t yang lebih baharu telah membawa kepada ralat yang tidak dijangka.
Dalam coretan kod di bawah, kami mentakrifkan dua fungsi templat f() menggunakan std::enable_if:
template<typename T, typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr> void f() { } template<typename T, typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr> void f() { }
Apabila mengalihkan kod ini untuk menggunakan std::enable_if_t baharu sintaks, kami menghadapi isu:
template<typename T, typename = std::enable_if_t<std::is_same<int, T>::value>> void g() { } template<typename T, typename = std::enable_if_t<std::is_same<double, T>::value>> void g() { }
GCC mengadu dengan ralat berikut:
error: redefinition of 'template<class T, class> void g()' void g() { }
Untuk memahami sebab ralat ini berlaku, kita perlu meneliti sintaks hujah templat. Mengalih keluar kod yang tidak diperlukan, kami mempunyai perwakilan ringkas berikut bagi fungsi kami:
template< class T, class U/* = std::enable_if_t<std::is_same<int, T>::value>*/ > void g() { } template< class T, class U/* = std::enable_if_t<std::is_same<double, T>::value>*/ > void g() { }
Menjadi jelas bahawa kedua-dua templat adalah daripada jenis templat
Untuk menyelesaikan isu ini, kita boleh menukar hujah kedua kepada jenis penunjuk dengan jenis bergantung:
template< class T, std::enable_if_t<std::is_same<int, T>::value, int>* = nullptr > void f() { } template< class T, std::enable_if_t<std::is_same<double, T>::value, int>* = nullptr > void f() { }
Dalam kod yang diubah suai ini, tandatangan fungsi templat kini unik, menghapuskan konflik dan membenarkan pemadanan templat yang betul.
Atas ialah kandungan terperinci Mengapakah `enable_if_t` Gagal dalam Definisi Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!