Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara Memilih Fungsi Berdasarkan Parameter Templat Menggunakan enable_if: Mengapakah ralat \"tiada jenis bernama \'type\' dalam 'struct std::enable_if'\" Berlaku dan Bagaimana Ia Boleh Diselesaikan?

Cara Memilih Fungsi Berdasarkan Parameter Templat Menggunakan enable_if: Mengapakah ralat \"tiada jenis bernama \'type\' dalam 'struct std::enable_if'\" Berlaku dan Bagaimana Ia Boleh Diselesaikan?

Susan Sarandon
Susan Sarandonasal
2024-10-26 12:00:05563semak imbas

How to Choose a Function Based on Template Parameters Using enable_if: Why does the

Cara Memilih Fungsi Berdasarkan Parameter Templat Menggunakan Enable_if

Masalah:

Menentukan versi ahli kelas yang mana fungsi harus dipanggil berdasarkan parameter templat kelas boleh mencabar. Menggunakan enable_if boleh menjadi penyelesaian, tetapi anda mungkin menghadapi ralat seperti "tiada jenis bernama 'type' dalam 'struct std::enable_if'".

Penyelesaian:

Isunya terletak pada penggantian hujah templat. enable_if berfungsi dengan menghapuskan lebihan beban yang mengakibatkan ralat semasa penggantian hujah templat. Dalam kod yang disediakan, tiada penggantian berlaku kerana T sudah diketahui pada masa instantiasi fungsi ahli.

Untuk menyelesaikan masalah ini, buat argumen templat tiruan yang lalai kepada T dan gunakan itu untuk SFINAE (Kegagalan Penggantian Bukan Satu Ralat). Gantikan kod bermasalah dengan yang berikut:

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

Nota:

Untuk menghalang pengguna daripada menyatakan hujah templat secara eksplisit dan berkemungkinan mendapat hasil yang salah, anda boleh menambah statik penegasan kepada fungsi ahli, seperti yang dilihat dalam contoh berikut:

<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 Cara Memilih Fungsi Berdasarkan Parameter Templat Menggunakan enable_if: Mengapakah ralat \"tiada jenis bernama \'type\' dalam 'struct std::enable_if'\" Berlaku dan Bagaimana Ia Boleh Diselesaikan?. 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