Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menggunakan enable_if untuk Memilih Fungsi Ahli Berdasarkan Argumen Templat?
Memilih Fungsi Ahli Menggunakan Syarat enable_if yang berbeza
Metafungsi enable_if digunakan untuk menentukan parameter fungsi templat dan memilih fungsi ahli yang sesuai berdasarkannya . Pertimbangkan kod berikut:
<code class="cpp">template<typename T> struct Point { // Check if T is int and call MyFunction for int void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T &>::type* = 0) { std::cout << "T is int." << std::endl; } // Check if T is not int and call MyFunction for non-int void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float &>::type* = 0) { std::cout << "T is not int." << std::endl; } };</code>
Walau bagaimanapun, kod ini mungkin menyebabkan ralat pengkompil yang menunjukkan bahawa "tiada jenis bernama 'type' dalam 'struct std::enable_if'".
Memahami enable_if
enable_if memastikan bahawa hanya lebihan fungsi yang berdaya maju dipertimbangkan semasa resolusi beban lampau. Jika penggantian hujah templat gagal, lebihan beban itu dialih keluar daripada set calon.
Dalam contoh di atas, hujah templat T sudah diketahui semasa membuat seketika fungsi ahli. Untuk melaksanakan gelagat yang diingini, kita boleh mencipta hujah templat tiruan yang lalai kepada T dan melaksanakan SFINAE menggunakannya:
<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>
Atas ialah kandungan terperinci Bagaimana untuk Menggunakan enable_if untuk Memilih Fungsi Ahli Berdasarkan Argumen Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!