56 votes

variable constexpr statique vs fonction

Existe-t-il une différence entre déclarer une constante en virgule flottante sous forme de variable static constexpr et une fonction comme dans l'exemple ci-dessous, ou s'agit-il simplement d'une question de style?

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

57voto

Morwenn Points 4071

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.

C++14: constexpr variable modèles

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X