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.
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.
C++ 14? Co to jest? : D – cubuspl42
@ 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
Czy możesz podać dowolny link? – cubuspl42