>백엔드 개발 >C++ >C에서 인스턴스나 파생 클래스 없이 정적 멤버를 초기화하는 방법은 무엇입니까?

C에서 인스턴스나 파생 클래스 없이 정적 멤버를 초기화하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 10:18:30789검색

How to Initialize Static Members Without Instances or Derived Classes in C  ?

인스턴스 조작이나 파생 클래스 개입 없이 정적 멤버를 강제로 초기화하는 방법

정적 클래스를 초기화하려는 시나리오를 고려하세요. 인스턴스를 생성하지 않거나 파생 클래스를 포함하지 않더라도 특정 클래스가 인스턴스화될 때 멤버입니다. 이를 달성하기 위한 전략을 살펴보겠습니다.

템플릿 트릭 사용

템플릿 트릭을 도입하면 인스턴스를 요구하거나 파생 클래스를 변경하지 않고도 정적 멤버 초기화를 강제할 수 있습니다. 정수 참조와 해당 값을 매개변수로 사용하는 value라는 특수 템플릿 클래스를 생성하면 원하는 결과를 얻을 수 있습니다.

<code class="cpp">template<typename T, T> struct value { };

template<typename T>
struct HasStatics {
  static int a; // We enforce initialization
  typedef value<int&, a> value_user;
};

template<typename T>
int HasStatics<T>::a = /* Desired side-effect */;</code>

구문 모호성 활용

또 다른 접근 방식은 C 구문의 모호성을 활용하는 것입니다. typedef와 중첩된 열거형의 영리한 조합을 사용하면 파생 클래스에 영향을 주지 않고 여러 정적 멤버를 강제로 초기화할 수 있습니다.

<code class="cpp">template<typename T, T> struct var { enum { value }; };
typedef char user;

template<typename T>
struct HasStatics {
  static int a; // We enforce initialization
  static int b; // And this one too

  // Syntax Shenanigans
  user :var<int&, a>::value,
       :var<int&, b>::value;
};

template<typename T>
int HasStatics<T>::a = /* Desired side-effect */;

template<typename T>
int HasStatics<T>::b = /* Desired side-effect */;</code>

이러한 기술은 인스턴스 조작 없이 정적 멤버를 초기화하는 효율적인 방법을 제공합니다. 또는 파생 클래스 수정.

위 내용은 C에서 인스턴스나 파생 클래스 없이 정적 멤버를 초기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.