2013-04-29 3 views
50

부동 소수점 상수를 static constexpr 변수로 선언하는 것과 아래 예제와 같은 함수가 다르다는 것입니까 아니면 스타일의 문제입니까?정적 constexpr 변수 대 함수

class MY_PI 
{ 
public: 
    static constexpr float MY_PI_VAR = 3.14f; 
    static constexpr float MY_PI_FUN() { return 3.14f; } 
} 

답변

51

constexpr 기능

기능은 무료 변수 (입니다 14 C++까지)가 없습니다 이점을 가지고 : 그들은 쉽게 어떤 클래스 상용구없이 템플릿 수 있습니다. 당신이 쓰기, 그것은 짧은도 easir되지 않습니다 무료 기능을 대신 static 멤버 함수를 사용하기로 결정하는 경우,

template<typename T> 
constexpr T pi(); 

template<> 
constexpr float pi() { return 3.14f; } 

template<> 
constexpr double pi() { return 3.1415; } 

int main() 
{ 
    constexpr float a = pi<float>(); 
    constexpr double b = pi<double>(); 
} 

그러나 : 그것은 당신이 정밀 템플릿 인수에 따라 당신의 pi을 가질 수 있습니다 의미 static 멤버 변수보다

constexpr 변수

변수를 사용하는 주요 이점은 잘 ...이다. 상수를 원해, 그렇지? 그것은 은 의도를 명확히하고이며 여기가 가장 중요한 포인트 중 하나 일 수 있습니다.

당신은 여전히 ​​클래스와 동등한 동작을 수 있지만, 다음, 당신은 당신의 클래스가 기타 수학 상수를 포함하는 클래스의 경우 다음과 같이 사용 할 것 :

constexpr float a = constants<float>::pi; 

또는 클래스의 경우이 같은를 단지 pi을 표현하기위한 것입니다 :

constexpr double = pi<double>::value; 

을 첫 번째 경우, 당신은 짧아집니다 때문에 작성하는 변수를 사용하는 것이 좋습니다 그리고 정말 당신이 상수를 사용하여 뭔가를 계산하려고하지 않는 것을 보여줍니다. 파이를 나타내는 클래스가 있다면 클래스 전체가 아닌 constexpr 함수를 사용하면됩니다. IMHO가 더 간단해질 것입니다.

C++ 14 : 그러나 constexpr variable templates

는 대신 C++ 11의 C++ 14을 사용하도록 선택하는 경우, 당신은 constexpr 변수 템플릿의 다음과 같은 종류를 쓸 수 있습니다 :

이 같은 코드를 작성 할 수 있습니다
template<typename T> 
constexpr T pi = T(3.1415); 

: C++ 14에서

constexpr float a = pi<float>; 

,이 일을 할 수있는 좋은 방법이 될 수 있습니다. 이전 버전의 표준을 사용하는 경우 처음 두 단락은 계속 유지됩니다.

+0

C++ 14? 그게 뭐야? : D – cubuspl42

+4

@ cubuspl42 내년에 사용할 수있는 다음 C++ 표준. GCC와 Clang은 이미 일부 기능을 구현하기 시작했습니다. – Morwenn

+0

링크를 제공해 주시겠습니까? – cubuspl42