Mengapa anda harus mengelakkan `std::enable_if` dalam tandatangan fungsi?

Barbara Streisand
Lepaskan: 2024-10-31 07:52:30
asal
554 orang telah melayarinya

Why should you avoid `std::enable_if` in function signatures?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!