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
DDDasal
2024-10-26 05:50:30207semak imbas

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>

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>

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>

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