Buku Scott Meyers yang akan datang, EC 11, menasihati mengelakkan std::enable_if dalam tandatangan fungsi. Walaupun serba boleh dalam mengalih keluar fungsi atau kelas secara bersyarat daripada resolusi beban lampau, had tertentu dan isu kebolehbacaan memerlukan pertimbangan semula penggunaannya.
Fungsi Parameter:
<code class="cpp">template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< // Option 1: As function parameter std::is_same<U, int>::value >::type* = 0) { return 42; } };</code>
Parameter Templat:
<code class="cpp">template<typename T> struct Check2 { template<typename U = T, typename std::enable_if< // Option 2: As template parameter std::is_same<U, int>::value, int >::type = 0> U read() { return 42; } };</code>
Jenis Pemulangan:
<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() { // Option 3: As return type return 42; } };</code>
Penyelesaian optimum melibatkan meletakkan enable_if dalam parameter templat. Pendekatan ini menawarkan beberapa kelebihan:
Peningkatan Kebolehbacaan:
Penggunaan enable_if diasingkan daripada jenis pemulangan/hujah, meningkatkan kejelasan dan mengurangkan kekusutan.
Kebolehgunaan Universal:
Tidak seperti pilihan lain, peletakan parameter templat terpakai kepada pembina dan pengendali tanpa hujah tambahan.
Pengecualian Jenis Pulangan:
Sambil "Elakkan std::enable_if dalam tandatangan fungsi" terutamanya menangani penggunaannya dalam tandatangan fungsi biasa, ia digunakan untuk mengembalikan jenis dalam pengkhususan templat. Kebimbangan berpunca daripada isu kebolehbacaan apabila menggabungkan enable_if dengan jenis pemulangan.
Fungsi Ahli vs. Bukan Ahli:
Prinsip ini berlaku untuk kedua-dua templat fungsi ahli dan bukan ahli.
Atas ialah kandungan terperinci Sekiranya Anda Mengelakkan `std::enable_if` dalam Tandatangan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!