Bagaimana untuk Melaksanakan Lebihan Fungsi Ahli Bersyarat Menggunakan enable_if dalam C ?

Patricia Arquette
Lepaskan: 2024-10-28 14:18:30
asal
750 orang telah melayarinya

How to Implement Conditional Member Function Overloads Using enable_if in C  ?

Memilih Fungsi Ahli dengan Syarat enable_if yang berbeza

Dalam C , enable_if ialah alat yang digunakan untuk mendayakan atau melumpuhkan kod tertentu secara bersyarat berdasarkan sama ada hujah templat memenuhi kriteria tertentu. Ini boleh berguna apabila anda ingin menyesuaikan gelagat kelas atau fungsi berdasarkan parameter templatnya.

Dalam contoh yang diberikan, matlamatnya ialah untuk mencipta fungsi ahli MyFunction yang berkelakuan berbeza berdasarkan sama ada templat parameter T ialah integer atau tidak. Pelaksanaan yang dimaksudkan ialah menggunakan dua kelebihan MyFunction, satu untuk T = int dan satu untuk T != int.

Satu pendekatan untuk mencapai ini adalah melalui enable_if, seperti yang ditunjukkan dalam kod di bawah:

<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

Walau bagaimanapun, kod ini akan mengakibatkan ralat penyusunan disebabkan oleh penggunaan enable_if yang salah. Dalam C , penggantian hujah templat berlaku semasa resolusi beban lampau. Dalam kes ini, tiada penggantian berlaku kerana jenis T diketahui pada masa instantiasi fungsi ahli.

Untuk menyelesaikan isu ini, parameter templat tiruan boleh diperkenalkan dan lalai kepada T, membenarkan SFINAE (Kegagalan Penggantian Bukan Satu Ralat) untuk berfungsi dengan betul:

<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

Pendekatan ini memastikan versi MyFunction yang betul dipilih berdasarkan nilai T.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Lebihan Fungsi Ahli Bersyarat Menggunakan enable_if dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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