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