Vous parlez apparemment de C++
(pas encore de tags, donc je pense que c'est du C++ ici). Eh bien, vous semblez vouloir dire
Comme arguments à mon modèle, j'accepte tout type modèles une chaîne
Malheureusement, actuellement ce n'est pas encore possible. Il nécessite la fonctionnalité concept
qui sera dans la prochaine version C++. Here est une vidéo à leur sujet.
Ce que vous pouvez faire est d'accepter basic_string<CharT, TraitsT>
si vous voulez le garder générique, par exemple si vous voulez accepter des chaînes larges caractères aswell comme des chaînes étroites de caractère
template <typename CharT, typename TraitsT>
std::basic_string<CharT, TraitsT> strUpper(basic_string<CharT, TraitsT> theString) {
typedef basic_string<CharT, TraitsT> StringT;
for(typename StringT::iterator it = theString.begin();
it != theString.end();
++it)
{
*it = std::toupper(*it, std::locale());
}
return theString;
}
Il n'acceptera d'autres ou classes de cordes personnalisées ce qui arrive à être chaînes aussi. Si vous voulez que le garder totalement libre de ce qu'il accepte et ce qui ne
template <typename StringT>
StringT strUpper(StringT theString) {
for(typename StringT::iterator it = theString.begin();
it != theString.end();
++it)
{
*it = std::toupper(*it, std::locale());
}
return theString;
}
Vous devez dire aux utilisateurs de cette bibliothèque quelles fonctions et le type qu'ils doivent exposer pour cela à travailler. Le compilateur ne connaîtra pas ce contrat. Au lieu de cela, il lancera juste des messages d'erreur quand il s'agit d'appeler la fonction avec un type qui n'est pas une chaîne. Souvent, vous trouverez des pages de messages d'erreur et il est difficile d'obtenir la vraie raison de ce qui ne va pas. La fonctionnalité proposée Concepts pour la prochaine version de la norme corrige bien.
Si vous avez pas l'intention d'écrire une fonction générique, vous pouvez simplement aller de l'avant et d'écrire une fonction normale comme celui-ci
std::string strUpper(std::string theString) {
for(std::string::iterator it = theString.begin();
it != theString.end();
++it)
{
*it = std::toupper(*it, std::locale());
}
return theString;
}
Si vous avez pas l'intention d'inventer cette fonction pour apprendre en premier lieu, mais parce que vous n'avez pas trouvé un autre algorithme déjà écrit, regardez dans la bibliothèque boost string algorithm. Ensuite, vous pouvez écrire
boost::algorithm::to_upper(mystring);
Pourquoi cela est-il nécessaire/voulez-vous que ce soit un modèle? –
Comment les chaînes sont-elles codées? – BigSandwich
Daniel L a raison - il suffit de supprimer la ligne supérieure (en faisant de strUpper() une fonction non-template régulière) et tout fonctionnera comme vous le souhaitez. –