Rumah > pembangunan bahagian belakang > C++ > SFINAE dalam C : Jenis Pulangan lwn. Jenis Parameter untuk Pengkhususan Templat Bersyarat?

SFINAE dalam C : Jenis Pulangan lwn. Jenis Parameter untuk Pengkhususan Templat Bersyarat?

Mary-Kate Olsen
Lepaskan: 2024-12-13 02:33:13
asal
691 orang telah melayarinya

SFINAE in C  : Return Type vs. Parameter Type for Conditional Template Specialization?

SFINAE dalam Jenis Pengembalian Templat lwn. Parameter

Penerangan Masalah

Dalam C , SFINAE (Kegagalan Penggantian Bukan Ralat) boleh digunakan untuk dayakan atau lumpuhkan pengkhususan templat secara bersyarat berdasarkan ciri jenis. Walau bagaimanapun, isu biasa timbul apabila SFINAE digunakan secara berbeza dalam jenis pengembalian templat dan parameter templat.

Pertimbangkan fungsi utama berikut:

int main()
{
    foo(5);
    foo(3.4);
}
Salin selepas log masuk

Pelaksanaan Bersalah Menggunakan SFINAE dalam Parameter Templat

Apabila SFINAE diletakkan dalam parameter templat, seperti yang ditunjukkan di bawah, ia gagal untuk menyusun dengan ralat:

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void
{
    std::cout << "I'm an integrer!\n";
}

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void
{
    std::cout << "I'm a floating point number!\n";
}
Salin selepas log masuk

Pelaksanaan Betul Menggunakan SFINAE dalam Jenis Pulangan

Bagaimanapun, pelaksanaan ini berfungsi dengan betul:

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type
{
    std::cout << "I'm an integrer!\n";
}

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type
{
    std::cout << "I'm a floating point number!\n";
}
Salin selepas log masuk

Penjelasan

Perbezaan terletak pada cara lebihan templat fungsi ditakrifkan dalam standard C (14.5.6.1). Templat terlebih beban adalah setara jika ia mempunyai nama fungsi yang sama, bilangan parameter yang sama dan jenis parameter yang sama. Walau bagaimanapun, hujah templat lalai tidak dipertimbangkan dalam perbandingan ini.

Dalam pelaksanaan yang rosak, syarat SFINAE disertakan sebagai hujah templat lalai, menghasilkan dua templat fungsi yang sama ditakrifkan dua kali. Ini mencetuskan ralat penyusunan.

Dalam pelaksanaan yang betul, keadaan SFINAE digunakan sebagai sebahagian daripada jenis pengembalian templat. Memandangkan ini melibatkan parameter templat yang merujuk ungkapan, kedua-dua fungsi mempunyai tandatangan yang berbeza dan dengan itu membolehkan SFINAE berfungsi seperti yang dimaksudkan.

Atas ialah kandungan terperinci SFINAE dalam C : Jenis Pulangan lwn. Jenis Parameter untuk Pengkhususan Templat Bersyarat?. 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