105 votes

Paramètres de modèle non typés

Je comprends que le paramètre template non-type devrait être une expression intégrale constante. Quelqu'un peut-il faire la lumière pourquoi est-ce?

 template <std::string temp>
void foo()
{
     // ...
}
 

erreur C2993: 'std :: string': type illégal pour le paramètre de modèle non typé 'temp'.

Je comprends ce qu'est une expression intégrale constante. Quelles sont les raisons pour ne pas autoriser les types non constants tels que std::string comme dans l'extrait de code ci-dessus?

133voto

Xeo Points 69818

La raison pour laquelle vous ne pouvez pas le faire c'est parce que les expressions constantes ne peuvent pas être analysées et remplacé lors de la compilation. Ils pourraient changer au cours de l'exécution, ce qui nécessiterait la création d'un nouveau modèle en cours d'exécution, ce qui n'est pas possible parce que les modèles sont un moment de la compilation concept.

Voici ce que la norme permet la non-type de paramètres du modèle (14.1 [temp.param] p4):

Un non-type de modèle-paramètre doit avoir une des options suivantes (en option cv qualifiés) types:

  • intégrale ou type d'énumération,
  • pointeur vers un objet ou un pointeur de fonction,
  • lvalue référence à l'objet ou à la lvalue référence à la fonction,
  • pointeur de membre,
  • std::nullptr_t.

81voto

Nawaz Points 148870

Ce n'est pas permis.

Cependant, cela est autorisé:

 template <std::string * temp> //pointer to object
void f();

template <std::string & temp> //reference to object
void g();
 

Voir § 14.1 / 6,7,8 dans C ++ Standard (2003).


Illustration:

 template <std::string * temp> //pointer to object
void f()
{
   cout << *temp << endl;
}

template <std::string & temp> //reference to object
void g()
{
     cout << temp << endl;
     temp += "...appended some string";
}

std::string s; //must not be local as it must have external linkage!

int main() {
        s = "can assign values locally";
        f<&s>();
        g<s>();
        cout << s << endl;
        return 0;
}
 

Sortie:

 can assign values locally
can assign values locally
can assign values locally...appended some string
 

Démo en ligne sur ideone: http://ideone.com/gUWLU

31voto

Vous devez être capable de coder les arguments de modèle

template <std::string temp>
void f() {
 // ...
}

f<"foo">();
f<"bar">(); // different function!?

Maintenant une impl aurait besoin de venir avec une unique séquence de caractères pour un std::string ou, d'ailleurs, toutes les autres arbitraire défini par l'utilisateur de la classe, de stocker une valeur particulière, dont le sens n'est pas connu pour la mise en œuvre. Et en plus, la valeur de l'arbitraire des objets de la classe ne peut pas être calculé au moment de la compilation.

Il est prévu d'envisager de permettre littérale types de classe en tant que modèle des types de paramètres pour la post-C++0x, qui sont initialisés par des expressions constantes. Ceux-ci pourraient être déformés par le fait d'avoir les membres de données de façon récursive de déformation en fonction de leurs valeurs (pour les classes de base, par exemple, nous pouvons appliquer la profondeur de la première, de gauche à droite de la traversée). Mais il est certainement ne va pas au travail pour arbitraire des classes.

11voto

al-Acme Points 11571

Un non-type de modèle argument fourni à l'intérieur d'un modèle de liste d'arguments est une expression dont la valeur peut être déterminée au moment de la compilation. Ces arguments doivent être:

des expressions constantes, les adresses de des fonctions ou des objets externes de liaison, ou des adresses de classe statique les membres de l'.

Aussi, les littéraux de chaîne sont des objets ayant une liaison interne, de sorte que vous ne pouvez pas les utiliser comme arguments de modèle. Vous ne pouvez pas utiliser un pointeur global, soit. Virgule flottante littéraux ne sont pas autorisés, compte tenu de la possibilité évidente de l'arrondissement des erreurs.

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