Penukaran Jenis Tersirat Elegan dengan Fungsi Rakan Templat
Apabila berurusan dengan kelas templat, mendayakan penukaran jenis tersirat boleh menjadi mencabar. Pertimbangkan templat kelas A dengan pembina yang mengambil int dan operator terlebih beban untuk tambahan:
template <unsigned int m> class A { public: A(int) {} }; template<unsigned int m> A<m> operator+(const A<m>&, const A<m>&) { return A<m>(0); }
Biasanya, memanggil pembina dengan int memerlukan pemutus eksplisit. Walau bagaimanapun, contoh berikut menimbulkan ralat kompilasi:
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
Masalah Padanan Jenis Tepat
Isunya terletak pada cara resolusi beban lampau berfungsi untuk fungsi templat. Semasa potongan jenis, pengkompil mencari padanan tepat untuk parameter templat. Dalam kes kami, ia gagal memadankan hujah int kepada pembina kerana jenisnya tidak sejajar dengan tepat.
Penyelesaian: Fungsi Rakan Bukan Ahli
Satu yang elegan penyelesaiannya ialah dengan mentakrifkan fungsi rakan bukan ahli di dalam definisi kelas:
template <typename T> class test { friend test operator+(test const &, test const &) { return test(); } };
Untuk setiap instantiasi templat, pengkompil menjana fungsi bukan templat yang berasingan pada peringkat ruang nama dengan tandatangan yang sesuai:
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
Kelebihan Fungsi Rakan Bukan Ahli
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Penukaran Jenis Tersirat Elegan dengan Fungsi Rakan Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!