programing

템플릿 메타 프로그래밍-Enum Hack과 Static Const 사용의 차이점

projobs 2021. 1. 16. 09:12
반응형

템플릿 메타 프로그래밍-Enum Hack과 Static Const 사용의 차이점


템플릿 메타 프로그래밍 기술을 사용할 때 정적 const와 enum 해킹을 사용하는 것의 차이점이 무엇인지 궁금합니다.

예 : (TMP를 통한 피보나치)

template< int n > struct TMPFib {
  static const int val =
    TMPFib< n-1 >::val + TMPFib< n-2 >::val;
};

template<> struct TMPFib< 1 > {
  static const int val = 1;
};

template<> struct TMPFib< 0 > {
  static const int val = 0;
};

template< int n > struct TMPFib {
  enum {
    val = TMPFib< n-1 >::val + TMPFib< n-2 >::val
  };
};

template<> struct TMPFib< 1 > {
  enum { val = 1 };
};

template<> struct TMPFib< 0 > {
  enum { val = 0 };
};

왜 다른 하나를 사용합니까? 정적 const가 클래스 내에서 지원되기 전에 열거 형 해킹이 사용되었다고 읽었지만 지금은 왜 사용합니까?


열거 형은 lval이 아니고 정적 멤버 값은 다음과 같으며 참조로 전달되면 템플릿이 인스턴스화됩니다.

void f(const int&);
f(TMPFib<1>::value);

순수한 컴파일 시간 계산 등을 수행하려는 경우 이는 바람직하지 않은 부작용입니다.

주요 역사적 차이점은 열거 형은 멤버 값의 클래스 내 초기화가 지원되지 않는 컴파일러에서도 작동한다는 것입니다. 이제 대부분의 컴파일러에서이 문제를 해결해야합니다.
enum과 static const 사이에 컴파일 속도가 다를 수도 있습니다.

부스트 코딩 지침 에 몇 가지 세부 사항이 있으며 주제에 관한 부스트 아카이브 이전 스레드 가 있습니다.


일부에게는 전자가 해킹이 덜하고 자연스러워 보일 수 있습니다. 또한 클래스를 사용하는 경우 자체적으로 할당 된 메모리가 있으므로 예를 들어 val의 주소를 사용할 수 있습니다.

후자는 일부 오래된 컴파일러에서 더 잘 지원됩니다.


에 플립 측면에서 @Georg 정적의 CONST 변수를 포함하는 구조 전문 템플릿에 정의 될 때 링커가 그것을 발견하고 실제로에게 주소를 제공 할 수 있도록 대답의 ', 그것은에 의해 참조되는 소스에 선언해야 . 이것은 특히 헤더 전용 라이브러리를 생성하려는 경우 불필요하게 (원하는 효과에 따라) 부적합한 코드를 유발할 수 있습니다. 값을 반환하는 함수로 값을 변환하여 문제를 해결할 수 있습니다. 그러면 런타임 정보에 대한 템플릿도 열 수 있습니다.

참조 URL : https://stackoverflow.com/questions/2172647/template-metaprogramming-difference-between-using-enum-hack-and-static-const

반응형