Rumah >pembangunan bahagian belakang >C++ >Mengapakah `enable_if_t` Gagal dalam Definisi Fungsi?

Mengapakah `enable_if_t` Gagal dalam Definisi Fungsi?

DDD
DDDasal
2024-11-18 03:21:02329semak imbas

Why Does `enable_if_t` Fail in Function Definitions?

Pertembungan Argumen Templat: Mengapa enable_if_t Gagal dalam Takrifan

Dalam pengaturcaraan templat, bukan sesuatu yang luar biasa untuk menghadapi situasi di mana kita perlu mendayakan secara bersyarat atau lumpuhkan fungsi templat berdasarkan keadaan tertentu. Dalam kes sedemikian, templat std::enable_if sering digunakan untuk mencapai ini. Walau bagaimanapun, percubaan baru-baru ini untuk menggunakan sintaks std::enable_if_t yang lebih baharu telah membawa kepada ralat yang tidak dijangka.

Dalam coretan kod di bawah, kami mentakrifkan dua fungsi templat f() menggunakan std::enable_if:

template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }

Apabila mengalihkan kod ini untuk menggunakan std::enable_if_t baharu sintaks, kami menghadapi isu:

template<typename T,
         typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }

GCC mengadu dengan ralat berikut:

error: redefinition of 'template<class T, class> void g()'
       void g() { }

Untuk memahami sebab ralat ini berlaku, kita perlu meneliti sintaks hujah templat. Mengalih keluar kod yang tidak diperlukan, kami mempunyai perwakilan ringkas berikut bagi fungsi kami:

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<int, T>::value>*/
>
void g() { }

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<double, T>::value>*/
>
void g() { }

Menjadi jelas bahawa kedua-dua templat adalah daripada jenis templatvoid(), tanpa mengira nilai lalainya yang berbeza untuk hujah jenis kedua. Ini bercanggah dengan keperluan C bahawa dua fungsi templat jenis templat yang sama perlu mempunyai tandatangan yang berbeza.

Untuk menyelesaikan isu ini, kita boleh menukar hujah kedua kepada jenis penunjuk dengan jenis bergantung:

template<
  class T,
  std::enable_if_t<std::is_same<int, T>::value, int>* = nullptr
>
void f() { }

template<
  class T,
  std::enable_if_t<std::is_same<double, T>::value, int>* = nullptr
>
void f() { }

Dalam kod yang diubah suai ini, tandatangan fungsi templat kini unik, menghapuskan konflik dan membenarkan pemadanan templat yang betul.

Atas ialah kandungan terperinci Mengapakah `enable_if_t` Gagal dalam Definisi Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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