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!