constexpr
fonctions
Les fonctions ont encore un avantage que les variables n'ont pas: ils peuvent facilement être modélisé sans une certaine classe standard. Cela signifie que vous pouvez avoir votre pi
avec une précision selon un argument de modèle:
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>();
}
Cependant, en tant que classe, static
membre, la fonction ne sera pas plus courte ou plus facile à écrire qu'à une variable.
constexpr
variables
Le principal avantage de l'utilisation d'une variable, c'est que... bien. Vous voulez une constante, non? Il précise l'objet et c'est peut-être l'un des points les plus importants ici.
Vous pourriez quand même avoir un comportement équivalent à une classe, mais ensuite, vous avez à l'utiliser comme ceci si votre classe est une classe contenant divers mathématiques constantes:
constexpr float a = constants<float>::pi;
Ou comme ceci si votre classe est uniquement destiné à représenter l' pi
:
constexpr double = pi<double>::value;
Dans le premier cas, vous préférerez peut-être utiliser des variables, car il sera plus court à écrire et qui va vraiment montrer que vous êtes en utilisant une constante et ne cherche pas à calculer quelque chose. Si vous avez simplement une classe représentant pi, vous pouvez cependant aller avec un de libre - constexpr
fonction au lieu de l'ensemble de la classe. Il serait à mon humble avis être plus simple.
Toutefois, notez que si vous choisissez d'utiliser le C++14 au lieu de C++11, vous serez en mesure d'écrire le type suivant d' constexpr
variable modèles:
template<typename T>
constexpr T pi= T(3.1415);
Qui va vous permettre d'écrire votre code comme ceci:
constexpr float a = pi<float>;
En C++14, cela peut être la meilleure façon de faire les choses. Si vous utilisez une ancienne version de la norme, les deux premiers paragraphes sont toujours.