Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Gelagat SFINAE Berbeza Antara Jenis Pemulangan dan Parameter Templat dalam Lebihan Fungsi C?

Bagaimanakah Gelagat SFINAE Berbeza Antara Jenis Pemulangan dan Parameter Templat dalam Lebihan Fungsi C?

Linda Hamilton
Lepaskan: 2024-12-27 04:43:51
asal
631 orang telah melayarinya

How Does SFINAE Behavior Differ Between Return Types and Template Parameters in C   Function Overloads?

Perbezaan Tingkah Laku SFINAE dalam Jenis Pulangan lwn Parameter Templat

Dalam C , simpulan bahasa Gantian Bukan Ralat (SFINAE) membenarkan bersyarat lebihan fungsi berdasarkan metaprogramming templat dan ciri jenis. Walau bagaimanapun, terdapat keadaan di mana SFINAE berkelakuan berbeza bergantung pada peletakannya dalam perisytiharan templat fungsi.

Pertimbangkan kod berikut:

template<typename T,
         typename = typename std::enable_if<
                        std::is_integral<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T,
         typename = typename std::enable_if<
                        std::is_floating_point<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_integral<T>::value>::type;

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_floating_point<T>::value>::type;
Salin selepas log masuk

Dalam set pertama lebihan (peletakan yang salah), meletakkan SFINAE dalam parameter templat dan bukannya jenis pulangan mengakibatkan ralat penyusunan. Ini kerana argumen templat lalai (dalam kes ini, akhiran ::type) tidak dipertimbangkan dalam menentukan kesetaraan beban lampau. Akibatnya, pengkompil menganggap fungsi sebagai pengisytiharan pendua dengan tandatangan yang sama.

Walau bagaimanapun, dalam set kedua lebihan (peletakan yang betul), SFINAE digunakan pada jenis pemulangan, yang melibatkan pengaturcaraan meta templat. Peletakan ini memastikan bahawa ungkapan yang merujuk kepada parameter templat adalah sebahagian daripada tandatangan fungsi. Akibatnya, pengkompil mengiktiraf beban berlebihan sebagai entiti yang berbeza, membolehkan SFINAE berfungsi dengan baik.

Atas ialah kandungan terperinci Bagaimanakah Gelagat SFINAE Berbeza Antara Jenis Pemulangan dan Parameter Templat dalam Lebihan Fungsi 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