Penukaran Jenis Tersirat dengan Templat
Pertanyaan meneroka isu mendayakan penukaran jenis tersirat dalam kelas templat. Pertimbangkan kes kelas templat A dengan pembina yang menerima integer.
template <unsigned int m> class A { public: A(int); };
Selain itu, terdapat operator ' ' yang mengembalikan tika A diberikan dua objek A.
template<unsigned int m> A<m> operator+(const A<m>&, const A<m>&) { return A<m>(0); }
Masalah timbul apabila cuba menukar integer kepada objek A secara tersirat. Sebagai contoh, kod berikut cuba berbuat demikian, tetapi pengkompil menimbulkan ralat:
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
Penyelesaian
Penyelesaian terletak pada mengeksploitasi ciri bahasa yang membenarkan definisi fungsi rakan bukan ahli dalam definisi kelas. Dalam kes templat, bagi setiap instantiasi templat, pengkompil menjana fungsi bukan templat percuma dengan tandatangan yang diperoleh dengan menggantikan jenis sebenar instantiasi dalam pengisytiharan rakan:
template <typename T> class test { friend test operator+(test const &, test const &); // [1] }; test<int> t; // [2]
Dalam [ 1], pengkompil membenarkan definisi fungsi rakan di dalam skop kelas. Kemudian, dalam [2], apabila templat dijadikan instantiated, pengkompil menjana fungsi percuma:
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
Fungsi bukan templat ini sentiasa ditakrifkan, tidak kira sama ada ia digunakan atau tidak.
Sihir Penukaran Tersirat
"Sihir" di sini terletak pada aspek berikut:
Walau bagaimanapun, penyelesaian ini juga mempunyai beberapa had:
Walaupun pengehadan ini, penyelesaian ini menyediakan cara yang elegan untuk membolehkan penukaran tersirat dalam kelas templat, membolehkan kod yang lebih fleksibel dan mudah .
Atas ialah kandungan terperinci Bagaimanakah Penukaran Jenis Tersirat Boleh Didayakan dalam Kelas Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!