Rumah >pembangunan bahagian belakang >C++ >Bagaimana Memaksa Permulaan Ahli Statik Secara Automatik dalam C ?
Cara Memaksa Permulaan Ahli Statik Secara Automatik
Ahli statik dalam C tidak dimulakan secara automatik melainkan ia digunakan dengan cara yang memerlukannya definisi wujud. Tingkah laku ini kadangkala boleh menyusahkan, terutamanya apabila anda ingin melakukan kesan sampingan semasa permulaan ahli statik.
Pertimbangkan contoh 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, anda menjangkakan dummy akan menjadi dimulakan sebaik sahaja terdapat instantiasi konkrit Foo, yang anda miliki dengan Bar. Walau bagaimanapun, ini tidak berlaku disebabkan oleh tingkah laku pemula malas ahli statik.
Untuk memaksa pemulaan dummy tanpa sebarang contoh Bar atau Foo, anda boleh menggunakan salah satu daripada teknik berikut:
<code class="cpp">template<class D> struct Bar : Foo<Bar> { static char const get_dummy() { return (void)dummy; return 42; } };</code>
<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>
<code class="cpp">template<typename T, T> struct var { enum { value }; }; typedef char user; template<typename T> struct HasStatics { static int a; // we force this to be initialized static int b; // and this // hope you like the syntax! 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 membolehkan anda memaksa permulaan ahli statik tanpa memerlukan campur tangan pengguna atau mengubah suai kelas terbitan. Teknik khusus untuk digunakan bergantung pada keperluan khusus anda dan pilihan gaya pengekodan.
Atas ialah kandungan terperinci Bagaimana Memaksa Permulaan Ahli Statik Secara Automatik dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!