2013-04-29 23 views
50

Czy istnieje różnica między deklarowaniem stałej zmiennoprzecinkowej jako zmiennej static constexpr a funkcją jak w przykładzie poniżej, czy jest to tylko kwestia stylu?Zmienna statyczna constexpr vs funkcja

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

Odpowiedz

51

constexpr funkcje

funkcje mają tę zaletę, że zmienne wolne nie mają (do C++ 14, że jest): można je łatwo matrycy bez jakiejś klasy boilerplate. Oznacza to, że możesz mieć swój pi z dokładnością zależności od argumentu szablonu:

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>(); 
} 

Jednakże, jeśli zdecydujesz się skorzystać z funkcji static członek zamiast wolnej funkcji, nie będzie krótszy ani easir napisać niż zmienna składowa static.

constexpr zmienne

Główną zaletą korzystania zmienną jest ... dobrze. Chcesz stałej, prawda? To wyjaśnia intencję i może to być jeden z najważniejszych punktów tutaj.

Można nadal mają równoważną zachowanie z klasy, ale wtedy trzeba by użyć go w ten sposób, jeśli klasa jest klasą zawierającą Różny matematyczne stałe:

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

albo jak to, czy twoja klasa jest przeznaczona wyłącznie do reprezentowania pi:

constexpr double = pi<double>::value; 

W pierwszym przypadku może wolisz używać zmiennych ponieważ będzie krótszy pisać i że będzie naprawdę pokazać, że używasz stała i nie próbuje obliczyć coś. Jeśli masz tylko klasę reprezentującą pi, możesz jednak skorzystać z bezpłatnej funkcji constexpr zamiast całej klasy. Byłoby IMHO być prostsze.

C++ 14: constexpr variable templates

jednak pamiętać, że jeśli zdecydujesz się korzystać z C++ 14 zamiast C++ 11, będzie można napisać następujący rodzaj constexpr zmiennych szablonów:

template<typename T> 
constexpr T pi = T(3.1415); 

to pozwoli Ci napisać kod tak:

constexpr float a = pi<float>; 

w C++ 14, może to być najlepszym sposobem, aby robić różne rzeczy. Jeśli używasz starszej wersji standardu, pierwsze dwa akapity nadal są w pamięci.

+0

C++ 14? Co to jest? : D – cubuspl42

+4

@ cubuspl42 Następny standard C++, który powinien być dostępny w przyszłym roku. GCC i Clang już rozpoczęły wdrażanie niektórych funkcji. – Morwenn

+0

Czy możesz podać dowolny link? – cubuspl42

Powiązane problemy