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

DDD
Lepaskan: 2024-11-09 11:52:02
asal
242 orang telah melayarinya

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);
}
Salin selepas log masuk

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;
Salin selepas log masuk

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();
    }
};
Salin selepas log masuk

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>();
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan