이 질문은 내 앞의 질문을 참조 상수 : float conversions in templates컴파일시 전환은
내가 부동 소수점 상수의 런타임 변환을 방지하고 싶습니다. 이전 질문에서 취한 일반적인 견해는 실행시에 변환이 허용된다는 것입니다. 즉, float(.5)
변환이 허용됩니다. 그러나 대한 방법 :
template <typename A, typename B>
constexpr A convert(B const a)
{
return a;
}
어설 constexpr
함수의 컴파일 타임 평가를 보장하기 위해 여기에 설명되어 있습니다 : When does a constexpr function get evaluated at compile time?
컴파일에서 이러한 변환을 수행 할 수있는 유일한 보장 방법 constexpr
+ assert
조합인가 -시각?
, 내가 제공 한 convert
기능이 불필요하다고, 결론에 도달했습니다.
#define CONVERT(T, V) static constexpr T const T##_##V(V)
int main()
{
CONVERT(float, 1);
::std::cout << float_1 << std::endl;
return 0;
}
가장 좋은 대안은 ::std::integral_constant
의 floating_point_constant
대응이 될 것입니다,하지만 슬프게도, 하나를 쓸 수 없습니다 : 내가 함께 할 수있는 최선이었다.
내가 얻을 수 없다 (사용되지 않는 변수에 대한 명백한 경고로;) 않지만 컴파일되지 않는 아이디어, 왜 12.34f를 쓰는 것이 아니라, 이것은 플로트 타입의 상수 일 것입니다. – fghj
'double','int' 또는 다른 형식으로의 변환이 가능하기 때문입니다. 나는 컴파일 타임에 대상 유형에서 소스 값의 가능한 근사값을 얻고 싶습니다. – user1095108