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; };
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); }
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(); }
Parameter lalai = 0 memastikan bahawa kedua-dua pilihan boleh dipanggil dengan foo
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>
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!