템플릿 메타 프로그래밍-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 변수를 포함하는 구조 전문 템플릿에 정의 될 때 링커가 그것을 발견하고 실제로에게 주소를 제공 할 수 있도록 대답의 ', 그것은에 의해 참조되는 소스에 선언해야 . 이것은 특히 헤더 전용 라이브러리를 생성하려는 경우 불필요하게 (원하는 효과에 따라) 부적합한 코드를 유발할 수 있습니다. 값을 반환하는 함수로 값을 변환하여 문제를 해결할 수 있습니다. 그러면 런타임 정보에 대한 템플릿도 열 수 있습니다.
'programing' 카테고리의 다른 글
System.IO.PathTooLongException을 피하는 방법? (0) | 2021.01.16 |
---|---|
jQuery UI 색상 선택기 (0) | 2021.01.16 |
모바일 사파리에서 iFrame을 올바르게 표시하는 방법 (0) | 2021.01.16 |
C ++ 클래스를 JSON으로 변환 (0) | 2021.01.16 |
Go에서 [] byte 또는 string을 언제 사용합니까? (0) | 2021.01.16 |