Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana Memaksa Permulaan Ahli Statik Secara Automatik dalam C ?

Bagaimana Memaksa Permulaan Ahli Statik Secara Automatik dalam C ?

Susan Sarandon
Susan Sarandonasal
2024-10-28 05:04:02605semak imbas

How to Force Initialization of Static Members Automatically in 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:

  • Gunakan Pengkhususan Templat untuk Kelas Terbitan: Teknik ini melibatkan mencipta pengkhususan kelas templat untuk kelas terbitan dan secara manual memulakan ahli statik dalam pengkhususan itu.
<code class="cpp">template<class D>
struct Bar
    : Foo<Bar>
{
    static char const get_dummy() { return (void)dummy; return 42; }
};</code>
  • Gunakan Struktur Templat untuk Memaksa Permulaan: Teknik ini melibatkan penciptaan struct templat yang memaksa pemulaan ahli statik melalui pembolehubah ahli struct templat.
<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>
  • Gunakan Struktur Templat dengan Kesatuan Tanpa Nama Enum: Teknik ini serupa dengan yang sebelumnya, tetapi ia menggunakan kesatuan tanpa nama untuk memaksa pemulaan statik ahli.
<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!

Kenyataan:
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