Rumah > Artikel > pembangunan bahagian belakang > Mengapa Anda Harus Mengelak Menggunakan `std::enable_if` dalam Jenis Pulangan Fungsi?
Mengapa Berusaha Mengelak std::enable_if dalam Fungsi Tandatangan?
std::enable_if, alat serba boleh dalam C , boleh digunakan dalam pelbagai cara untuk mentakrifkan fungsi atau kelas secara bersyarat berdasarkan kriteria yang ditentukan. Walau bagaimanapun, Scott Meyers telah memberi amaran supaya tidak menggunakannya dalam tandatangan fungsi. Memahami pengesyoran ini memerlukan penerokaan strategi berbeza yang tersedia dengan std::enable_if dan implikasinya.
Pilihan Pelaksanaan:
<code class="cpp">template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if<std::is_same<U, int>::value>::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if<std::is_same<U, double>::value>::type* = 0) { return 3.14; } };</code>
<code class="cpp">template<typename T> struct Check2 { template<typename U = T, typename std::enable_if<std::is_same<U, int>::value, int>::type = 0> U read() { return 42; } template<typename U = T, typename std::enable_if<std::is_same<U, double>::value, int>::type = 0> U read() { return 3.14; } };</code>
<code class="cpp">template<typename T> struct Check3 { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value, U>::type read() { return 42; } template<typename U = T> typename std::enable_if<std::is_same<U, double>::value, U>::type read() { return 3.14; } };</code>
Pendekatan Pilihan:
Pendekatan yang paling sesuai ialah meletakkan enable_if dalam parameter templat. Teknik ini menawarkan kelebihan dalam kejelasan dan kepelbagaian.
Kejelasan:
Klausa enable_if boleh dibezakan daripada jenis pemulangan dan hujah, menghasilkan kod yang lebih mudah dibaca. Walaupun dengan penggunaan templat alias untuk mengurangkan kekacauan, klausa yang digabungkan dalam pendekatan lain masih menggabungkan konsep yang berasingan dan berbeza.
Kepelbagaian:
Teknik ini boleh digunakan secara universal digunakan pada pelbagai konteks, termasuk pembina tanpa jenis pulangan dan pengendali yang melarang hujah tambahan. SFINAE, kunci di sebalik tingkah laku bersyarat std::enable_if, hanya terpakai pada templat, seterusnya menyokong kesejagatan pendekatan ini.
Pengelakkan std::enable_if dalam Jenis Pulangan:
Apabila menggunakan std::enable_if dalam jenis balasan, kebimbangan bukan pada tandatangan fungsi tetapi lebih kepada pengkhususan templat. Meyers menasihatkan terhadap amalan ini atas sebab kejelasan dan ketekalan. Menentukan jenis pemulangan dengan enable_if memperkenalkan ketidakkonsistenan antara definisi templat dan templat asas:
<code class="cpp">template<typename T> struct Check4 { typename std::enable_if<std::is_same<T, int>::value, int>::type read() { return 42; } int read() { // error: redeclared without 'typename' return 3.14; // never used } };</code>
Templat Fungsi Ahli vs. Bukan Ahli:
Kebimbangan dan cadangan yang dibincangkan memohon kepada templat fungsi ahli dan bukan ahli. Tiada perbezaan ketara dalam pendekatan.
Atas ialah kandungan terperinci Mengapa Anda Harus Mengelak Menggunakan `std::enable_if` dalam Jenis Pulangan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!