Mengapa Anda Harus Mengelak std::enable_if dalam Fungsi Tandatangan?
std::enable_if ialah alat yang berkuasa untuk pengaturcaraan templat bersyarat, tetapi penyalahgunaannya dalam tandatangan fungsi boleh membawa kepada pelbagai perangkap. Artikel ini meneroka sebab anda secara amnya harus mengelak daripada menggunakan std::enable_if dalam tandatangan fungsi dan menyediakan pendekatan alternatif.
Parameter Fungsi Membolehkan
Apabila digunakan sebagai parameter fungsi, std ::enable_if boleh mengacaukan tandatangan fungsi dengan ungkapan nama taip yang kompleks. Ini merendahkan kebolehbacaan dan menjadikan kod lebih sukar untuk dikekalkan. Contohnya:
<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>
Parameter Templat Membolehkan
Pendekatan yang disyorkan ialah meletakkan std::enable_if dalam parameter templat:
<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>
Pendekatan ini meningkatkan kebolehbacaan dengan memisahkan parameter templat daripada jenis pulangan/hujah. Ia juga menyediakan kebolehgunaan universal, kerana pembina dan pengendali tertentu tidak boleh mempunyai argumen tambahan atau jenis pulangan.
Jenis Pulangan Membolehkan
Menggunakan std::enable_if sebagai jenis pulangan ialah bukan sebahagian daripada tandatangan fungsi biasa. Walau bagaimanapun, ia boleh mengelirukan dan secara amnya harus dielakkan.
Templat Ahli vs. Bukan Ahli
Kebimbangan yang dinyatakan dalam artikel ini terpakai sama rata kepada ahli dan bukan -templat fungsi ahli.
Atas ialah kandungan terperinci Mengapa anda harus mengelakkan `std::enable_if` dalam tandatangan fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!