Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memilih Fungsi Ahli Berdasarkan Parameter Templat Kelas Menggunakan enable_if dalam 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!