Bagaimana Memaksa Permulaan Ahli Statik dalam C Tanpa Merujuk Secara Jelas Mereka?

Mary-Kate Olsen
Lepaskan: 2024-11-02 20:41:30
asal
828 orang telah melayarinya

How to Force Initialization of Static Members in C   Without Explicitly Referencing Them?

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

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

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

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!

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