Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah std::enable_if Berfungsi dengan Jenis Pulangan Bersyarat dan Parameter Templat?

Bagaimanakah std::enable_if Berfungsi dengan Jenis Pulangan Bersyarat dan Parameter Templat?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-05 21:26:02923semak imbas

How Does std::enable_if Work with Conditional Return Types and Template Parameters?

Memahami std::enable_if

Memahami std::enable_if memerlukan pemahaman tentang Kegagalan Penggantian Bukan Satu Ralat.

Takrifan std::enable_if

std::enable_if ialah templat khusus yang ditakrifkan sebagai:

<code class="cpp">template<bool Cond, class T = void> struct enable_if {};
template<class T> struct enable_if<true, T> { typedef T type; };</code>

Yang penting, definisi jenis T typedef hanya dicetuskan apabila bool Cond adalah benar.

Penggunaan dalam Jenis Pulangan Bersyarat

Pertimbangkan contoh:

<code class="cpp">template<typename T>
typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }</code>

Di sini, jenis pemulangan ditakrifkan oleh:

<code class="cpp">std::enable_if<std::numeric_limits<T>::is_integer, void>::type</code>

Penggunaan enable_if memastikan bahawa foo mempunyai jenis pulangan yang sah hanya jika is_integer adalah benar untuk T.

Menjalankan Lalai Parameter Templat Kedua

Dalam contoh:

<code class="cpp">template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(const T& bar) { isInt(); }</code>

Parameter templat kedua ditetapkan secara lalai kepada 0. Ini membolehkan foo dipanggil dengan satu parameter templat, mis. foo(1);.

Atas ialah kandungan terperinci Bagaimanakah std::enable_if Berfungsi dengan Jenis Pulangan Bersyarat dan Parameter Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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