Dalam C , std::enable_if ialah metafungsi yang membenarkan pengaktifan templat bersyarat berdasarkan kekangan tertentu. Ia baru-baru ini telah digantikan oleh std::enable_if_t yang lebih ringkas. Walau bagaimanapun, apabila cuba mengalihkan kod sedia ada untuk menggunakan sintaks baharu, sesetengah pengguna menghadapi ralat takrifan semula yang tidak dijangka.
Kod Contoh
Pertimbangkan kod berikut yang ditulis 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() { }
Kod ini berjaya disusun, dengan pengkhususan berasingan untuk int dan berganda. Sekarang, katakan kita mahu menulis semula ini menggunakan sintaks std::enable_if_t:
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() { }
Ralat Tidak Dijangka
Bertentangan dengan jangkaan, kod yang dikemas kini ini gagal untuk disusun, dengan GCC 5.2 pelaporan:
error: redefinition of 'template<class T, class> void g()' void g() { }
Penjelasan
Ralat terletak pada fakta bahawa std::enable_if_t mewakili jenis, bukan syarat. Apabila digunakan sebagai hujah templat, ia menentukan kekangan jenis. Dalam kes std::enable_if asal, parameter templat kedua ialah jenis penuding, manakala dalam versi std::enable_if_t, ia menjadi alias jenis. Ini menghasilkan dua hujah templat berbeza dengan jenis yang sama (void()).
Penyelesaian
Untuk mengelakkan kekaburan ini, kita perlu memastikan bahawa parameter templat kedua mewakili kekangan jenis yang unik. Satu cara untuk mencapai ini ialah menggunakan parameter templat tiruan:
template<typename T, typename U = std::enable_if_t<std::is_same<int, T>::value>> void g() { } template<typename T, typename U = std::enable_if_t<std::is_same<double, T>::value>> void g() { }
Dalam kes ini, U ialah parameter tiruan yang berfungsi semata-mata untuk membezakan dua hujah templat. Dengan pengubahsuaian ini, kod akan berjaya disusun.
Atas ialah kandungan terperinci Mengapa saya mendapat ralat definisi semula apabila menggunakan std::enable_if_t dalam hujah templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!