정적 멤버를 자동으로 강제 초기화하는 방법
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!