Bagaimana Memaksa Permulaan Ahli Statik Secara Automatik dalam C ?

Susan Sarandon
Lepaskan: 2024-10-28 05:04:02
asal
604 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk
  • 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>
Salin selepas log masuk
  • 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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!