静的メンバーを自動的に強制的に初期化する方法
C の静的メンバーは、必要な方法で使用されない限り、自動的に初期化されません。存在するという定義。この動作は、特に静的メンバーの初期化中に副作用を実行する必要がある場合に、不便になることがあります。
次の例を考えてみましょう。
<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>
この例では、ダミーが次のようになると予想されます。 Bar で持つ Foo の具体的なインスタンス化があるとすぐに初期化されます。ただし、静的メンバーの遅延初期化動作により、これは当てはまりません。
Bar または Foo のインスタンスを使用せずにダミーの初期化を強制するには、次のいずれかの手法を使用できます。
<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>
これらの手法を使用すると、ユーザーの介入や派生クラスの変更を必要とせずに、静的メンバーを強制的に初期化できます。使用する具体的な手法は、特定の要件とコーディング スタイルの好みによって異なります。
以上がC で静的メンバーの初期化を自動的に強制する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。