Permulaan Ahli Statik Paksa
Soalan biasa dalam pengaturcaraan C melibatkan memaksa pengamulaan ahli statik tanpa mencipta contoh kelas yang menentukan atau memerlukan pengguna untuk merujuk ahli secara eksplisit.
Pertimbangkan kod berikut:
<code class="cpp">template<class D> char register_(){ return D::get_dummy(); // static function } template<class D> struct Foo{ static char const dummy; }; template<class D> char const Foo<D>::dummy = register_<D>(); struct Bar : Foo<Bar> { static char const get_dummy() { return 42; } };</code>
Dalam contoh ini, kami menjangkakan dummy akan dimulakan selepas instantiasi Bar kelas konkrit. Walau bagaimanapun, seperti yang dinyatakan dalam standard, pemulaan ahli statik hanya berlaku apabila ahli digunakan dengan cara yang memerlukan takrifannya.
Untuk memaksa pemulaan, beberapa teknik boleh digunakan:
Menggunakan Jenis Nilai Dummy
<code class="cpp">template<typename T, T> struct value { }; template<typename T> struct HasStatics { static int a; // we force this to be initialized typedef value<int&, a> value_user; }; template<typename T> int HasStatics<T>::a = /* whatever side-effect you want */ 0;</code>
Pendekatan ini memperkenalkan nilai jenis dummy yang bergantung pada alamat ahli statik a. Dengan menggunakan value_user dalam konteks lain, kami secara tidak langsung mengakses a dan mencetuskan permulaannya.
Menggunakan Rujukan Ahli Tidak Langsung
<code class="cpp">template<typename T> struct HasStatics { static int a; // we force this to be initialized static int b; // and this user :var<int&, a>::value, :var<int&, b>::value; }; template<typename T> int HasStatics<T>::a = /* whatever side-effect you want */ 0; template<typename T> int HasStatics<T>::b = /* whatever side-effect you want */ 0;</code>
Teknik ini menggunakan ahli tanpa nama untuk mengakses alamat daripada ahli statik. Dengan merujuk ahli ini melalui jenis var, pengkompil terpaksa memulakan a dan b.
Atas ialah kandungan terperinci Bagaimana Memaksa Permulaan Ahli Statik dalam C Tanpa Merujuk Secara Jelas Mereka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!