템플릿 매개변수 제한 이해: 부동 소수점 값이 금지되는 이유
C에서는 템플릿 매개변수로 일반 클래스를 정의할 때 특정 제한 사항이 적용됩니다. 그러한 제한 중 하나는 부동 소수점 값을 비유형 템플릿 매개변수로 사용할 수 없다는 점입니다. 이는 다음과 같은 코드를 컴파일하려고 시도할 때 분명해집니다.
template <class T, T defaultValue> class GenericClass { // ... }; int main() { GenericClass<float, 4.6f> gcFloat; // Error }
오류 메시지:
'float' is not a valid type for a template constant parameter Invalid type in declaration before ';' token
논리:
C 11 표준에 따르면 비유형 템플릿 인수는 특정 요구 사항을 준수해야 합니다. 정수 또는 열거 유형의 비유형 템플릿 매개변수의 경우 동일한 유형의 변환된 상수 표현식만 허용됩니다. 부동 소수점 값은 메모리에 정확하게 표시될 수 없기 때문에 이 요구 사항을 충족하지 않습니다.
기술적 설명:
부동 소수점 값을 템플릿 인수로 사용하면 일관되지 않은 동작이 발생할 수 있습니다. 예를 들어, 다음을 고려하십시오.
func<1/3.f>(); func<2/6.f>();
동일한 함수를 두 번 호출하더라도 두 계산의 부동 소수점 표현은 동일하지 않을 수 있습니다. 이로 인해 템플릿 인수를 사용하는 목적이 무산되어 다른 결과가 발생할 수 있습니다.
대체 접근 방식:
부동 소수점 값을 템플릿 인수로 표현하려면 C 11 사용을 고려하세요. 상수 표현식(consexpr). 컴파일 타임에 부동 소수점 값의 분자와 분모를 계산하고 이를 별도의 정수 인수로 전달하는 고급 표현식을 만들 수 있습니다. 또한 서로 가까운 부동 소수점 값이 동일한 분자와 분모를 생성하도록 임계값을 정의합니다.
위 내용은 C에서 부동 소수점을 비유형 템플릿 매개변수로 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!