Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Memilih Fungsi Ahli Berdasarkan Parameter Templat Kelas Menggunakan enable_if dalam C ?

Bagaimana untuk Memilih Fungsi Ahli Berdasarkan Parameter Templat Kelas Menggunakan enable_if dalam C ?

DDD
Lepaskan: 2024-10-26 05:50:30
asal
252 orang telah melayarinya

How to Select Member Functions Based on Class Template Parameters Using enable_if in C  ?

Memilih Fungsi Ahli Menggunakan Syarat enable_if yang berbeza

Dalam C , metafungsi enable_if boleh digunakan untuk mendayakan atau melumpuhkan kod secara terpilih berdasarkan penyusunan -keadaan masa. Teknik ini sering digunakan untuk menyediakan lebihan fungsi ahli yang mengendalikan jenis argumen yang berbeza atau melakukan tindakan berbeza bergantung pada parameter templat.

Apabila cuba menggunakan enable_if untuk memilih antara fungsi ahli berdasarkan parameter templat kelas, adalah penting. untuk memahami bahawa enable_if berfungsi dengan menyebabkan penggantian argumen templat yang mengakibatkan ralat digugurkan daripada set resolusi beban lampau.

Masalah:

Dalam kod yang disediakan, syarat enable_if digunakan terus pada fungsi ahli, tetapi pendekatan ini tidak mencapai kesan yang diingini kerana hujah templat T sudah diketahui apabila membuat instantitation fungsi ini.

<code class="cpp">template<typename T>
struct Point
{
  void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T &>::type* = 0)
  {
    std::cout << "T is int." << std::endl;
  }

  void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float &>::type* = 0)
  {
    std::cout << "T is not int." << std::endl;
  }
};</code>
Salin selepas log masuk

Penyelesaian:

Untuk membetulkan isu ini, cipta hujah templat tiruan yang lalai kepada T dan gunakan itu untuk melakukan semakan SFINAE (Kegagalan Penggantian Bukan Ralat). Pendekatan ini membolehkan pengkompil menentukan fungsi ahli yang hendak digunakan berdasarkan jenis hujah tiruan.

<code class="cpp">template<typename T>
struct Point
{
  template<typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    std::cout << "T is int." << std::endl;
  }

  template<typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    std::cout << "T is not int." << std::endl;
  }
};</code>
Salin selepas log masuk

Mencegah Pengkhususan Argumen Templat Eksplisit:

Seperti yang dinyatakan oleh HostileFork, pengguna boleh menentukan hujah templat secara eksplisit untuk fungsi ahli, yang boleh membawa kepada hasil yang salah. Untuk mengelakkan ini, gunakan static_assert untuk memastikan tiada hujah eksplisit disediakan:

<code class="cpp">template<typename T>
struct Point
{
  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is int." << std::endl;
  }

  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is not int." << std::endl;
  }
};</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Memilih Fungsi Ahli Berdasarkan Parameter Templat Kelas Menggunakan enable_if dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan