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
615 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!

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!