> 백엔드 개발 > C++ > C에서 부동 소수점을 비유형 템플릿 매개변수로 사용할 수 없는 이유는 무엇입니까?

C에서 부동 소수점을 비유형 템플릿 매개변수로 사용할 수 없는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-21 15:49:09
원래의
741명이 탐색했습니다.

Why Can't I Use Floats as Non-Type Template Parameters in C  ?

템플릿 매개변수 제한 이해: 부동 소수점 값이 금지되는 이유

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿