Rumah > pembangunan bahagian belakang > C++ > Mengapakah terdapat Tugasan yang Seolah-olah Tidak Bermakna kepada std::enable_if dalam Templat C?

Mengapakah terdapat Tugasan yang Seolah-olah Tidak Bermakna kepada std::enable_if dalam Templat C?

Linda Hamilton
Lepaskan: 2024-11-06 10:49:02
asal
755 orang telah melayarinya

Why is there a Seemingly Meaningless Assignment to std::enable_if in C   Templates?

Memahami Kerja Dalaman std::enable_if

Dalam soalan baru-baru ini, penggunaan std::enable_if sebagai jenis pulangan bersyarat telah dibincangkan. Walaupun penggunaan pertama jelas, yang kedua, yang termasuk tugasan yang kelihatan tidak bermakna untuk std::enable_if, tetap membingungkan.

Membuka Kunci Konsep

Untuk membongkar misteri , kita mesti mendalami takrifan std::enable_if:

template<bool Cond, class T = void> struct enable_if {};
template<class T> struct enable_if<true, T> { typedef T type; };
Salin selepas log masuk

Kuncinya terletak pada fakta bahawa jenis typedef T hanya ditakrifkan apabila bool Cond adalah benar.

Memohon pada Contoh

Dengan pemahaman ini di tangan, mari kita semak semula kod:

template<typename T>
typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }
Salin selepas log masuk

Di sini, std::enable_if digunakan untuk menentukan jenis pemulangan fungsi foo . Jika T ialah integer, jenis pulangan akan terbatal; jika tidak, fungsi itu tidak akan disusun.

Peranan Lalai

Dalam contoh kedua:

template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(const T& bar) { isInt(); }
Salin selepas log masuk

Parameter lalai = 0 memastikan bahawa kedua-dua pilihan boleh dipanggil dengan foo(1);. Tanpa lalai, memanggil foo memerlukan dua parameter templat dan bukannya hanya int.

Mengembangkan Pemahaman

Dalam C 14, jenis std::enable_if_t diperkenalkan, yang harus digunakan sebagai ganti bentuk typedef. Ini menghasilkan jenis pulangan yang lebih ringkas:

std::enable_if_t<std::numeric_limits<T>::is_integer>
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah terdapat Tugasan yang Seolah-olah Tidak Bermakna kepada std::enable_if dalam Templat C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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