Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-10-26 12:00:05
asal
682 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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