Permulaan Ahli Statik C dalam Fungsi Templat Bersarang
Pengamatan ahli statik boleh dicapai melalui struct helper bersarang, terutamanya dalam kelas bukan templat. Walau bagaimanapun, pendekatan ini mungkin menghadapi masalah apabila kelas yang disertakan diparameterkan oleh templat. Khususnya, jika objek pembantu tidak diakses dalam kod utama, kelas pemulaan bersarang mungkin tidak berlaku seketika.
Pertimbangkan contoh mudah berikut, yang menggambarkan pemulaan vektor:
<code class="cpp">struct A { struct InitHelper { InitHelper() { A::mA = "Hello, I'm A."; } }; static std::string mA; static InitHelper mInit; static const std::string& getA(){ return mA; } }; std::string A::mA; A::InitHelper A::mInit; template<class T> struct B { struct InitHelper { InitHelper() { B<T>::mB = "Hello, I'm B."; } }; static std::string mB; static InitHelper mInit; static const std::string& getB() { return mB; } static InitHelper& getHelper(){ return mInit; } }; template<class T> std::string B<T>::mB; template<class T> typename B<T>::InitHelper B<T>::mInit;</code>
Apabila disusun dengan g 4.4.1, beberapa pemerhatian dibuat:
Tingkah laku ini berpunca daripada tafsiran pengkompil bagi standard ISO/IEC C 2003 (14.7.1). Piawaian menetapkan bahawa:
"Melainkan jika ahli templat kelas atau templat ahli telah dinyatakan secara eksplisit atau dikhususkan secara eksplisit, pengkhususan ahli itu dinyatakan secara tersirat apabila pengkhususan dirujuk dalam konteks yang memerlukan definisi ahli untuk wujud khususnya, permulaan (dan sebarang kesan sampingan yang berkaitan) bagi ahli data statik tidak berlaku melainkan ahli data statik itu sendiri digunakan dengan cara yang memerlukan definisi ahli data statik untuk wujud."
Ini menerangkan sebab, dalam contoh yang diberikan, ahli statik tidak dimulakan sehingga mereka diakses melalui kaedah getB() atau getHelper(). Menyatakan secara eksplisit templat kelas atau templat ahli dalam fungsi utama akan memaksa pemulaannya pada ketika itu. Walau bagaimanapun, untuk senario di mana akses langsung tidak boleh dilaksanakan, piawaian tidak menyatakan penyelesaian yang elegan untuk memulakan ahli statik dalam fungsi templat bersarang.
Atas ialah kandungan terperinci Bagaimana untuk Memulakan Ahli Statik dalam Fungsi Templat Bersarang dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!