Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencapai Penukaran Jenis Tersirat Elegan dengan Fungsi Rakan Templat?

Bagaimana untuk Mencapai Penukaran Jenis Tersirat Elegan dengan Fungsi Rakan Templat?

DDD
DDDasal
2024-11-09 11:52:02318semak imbas

How to Achieve Elegant Implicit Type Conversion with Template Friend Functions?

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

  • Genericity: Mereka menyediakan fungsi bukan templat untuk semua jenis instantiated, menjadikannya secara umum boleh digunakan.
  • Penukaran Tersirat: Sebagai fungsi bukan templat, ia boleh memanfaatkan penukaran tersirat untuk kedua-dua hujah, menyelesaikan isu jenis ketidakpadanan.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn