2013-09-21 2 views
2

이 질문은 내 앞의 질문을 참조 상수 : 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_constantfloating_point_constant 대응이 될 것입니다,하지만 슬프게도, 하나를 쓸 수 없습니다 : 내가 함께 할 수있는 최선이었다.

+0

내가 얻을 수 없다 (사용되지 않는 변수에 대한 명백한 경고로;) 않지만 컴파일되지 않는 아이디어, 왜 12.34f를 쓰는 것이 아니라, 이것은 플로트 타입의 상수 일 것입니다. – fghj

+0

'double','int' 또는 다른 형식으로의 변환이 가능하기 때문입니다. 나는 컴파일 타임에 대상 유형에서 소스 값의 가능한 근사값을 얻고 싶습니다. – user1095108

답변

1

그것은 내가 생각했던 것보다 더 쉽게 :

int a = 1; 
constexpr auto b = convert<float>(a); 

const int a = 1; 
constexpr auto b = convert<float>(a); 
constexpr auto c = convert<float>(1); 
constexpr auto d = convert<float>(1 + 2); 
constexpr auto e = convert<int>(1.0 + 2.0); 

+0

물론, 'constexpr' 변수가 필요합니다. – user1095108

+0

@ user1095108 and ... ... – stefan

+0

나는'convert' 호출을 임의의 표현식에 넣고 싶습니다. 런타임 호출에 대해 걱정할 필요가 없습니다. – user1095108