J'ai une classe de conteneur et d'autres parties de mon code doivent accéder à ses paramètres de modèle non-type. Vous ne pouvez pas accéder aux paramètres de modèle non-type avec l'opérateur ::, alors quelle est la méthode préférée pour obtenir ces valeurs?

Cet exemple de code minimal contient les trois méthodes que je connais:

#include <iostream>

template<int N>
struct Container 
{
    enum{Size = N};
    static const int m_size = N;
    constexpr int size() {return N;} //c++11
}; 

int main() {
    Container<42> c;

    //Output all three methods of getting N
    std::cout<< "::Size = " << Container<42>::Size << '\n';
    std::cout<< "m_size = " << c.m_size << '\n';
    std::cout<< "size() = " << c.size() << '\n';
}

Compiler avec GCC-4.9 (sans surprise) donne:

::Size = 42
m_size = 42
size() = 42

Ces trois méthodes fonctionnent , mais y a-t-il une différence de performances ou en termes d'optimisation du code par le compilateur?

Dans mon application particulière, les paramètres de modèle non-type sont fréquemment utilisés pour des choses comme les déclarations de tableau ou les fonctions arithmétiques. Ils sont connus au moment de la compilation, mais pas au moment de la conception. En conséquence, je veux que le compilateur utilise au mieux les informations indiquant que ces valeurs sont fixées, mais je ne veux pas les coder en dur quelque part dans les fichiers source, d'où le choix des paramètres du modèle.

3
Manik 3 janv. 2016 à 19:27

2 réponses

Meilleure réponse

Les solutions sont pour la plupart équivalentes .

  • enum est la méthode C ++ 03 (et son type n'est plus int).
  • La fonction constexptr peut être appelée à l'exécution (dans un contexte non constexpr).
  • static const a besoin d'une définition externe si l'adresse est prise

J'utiliserais cependant une variante du cas 2:

template<int N>
struct Container 
{
    static constexpr int m_size = N;
}; 
3
Jarod42 3 janv. 2016 à 16:38

Il n'y a aucune considération de performance ici du tout. Vous pouvez le mesurer, mais il est assez trivial de penser que les trois programmes se compileront de manière identique.

En termes de style, je préfère le membre static const int. Cela dépend vraiment de vous, cependant. Optez pour la cohérence de la conception.

1
Lightness Races in Orbit 3 janv. 2016 à 16:29