J'ai une classe de modèle qui contient un vecteur et une valeur par défaut

T _default;
vector<T> Vals;

Je veux l'itérer et imprimer les valeurs en fonction du type de défaut (soit string / int / double).

Alors j'ai écrit

if (typeid(int) == typeid(_default))
{
   for each(auto itr in Vals)
   {
     //logic to process each element in vector
     int temp;
     //temp = *itr; <------ how to convert from iterator to the value (value held in vector)
   }
}
else if (typeid(string) == typeid(_default))
{
   for each(auto itr in Vals)
   {         //logic to process each element in vector
     string temp;
     //temp = *itr; <------ how to convert from iterator to the value (value held in vector)


   }
}
else if (typeid(double) == typeid(_default))
{
   for each(auto itr in Vals)
   {
     //logic to process each element in vector
     double temp;
     //temp = *itr; <------ how to convert from iterator to the value (value held in vector)

   }
}

Comment convertir l'itérateur en int / string / double correspondant. Lorsque je le déréférencer en utilisant *itr me donne une erreur error C2100: illegal indirection.

METTRE À JOUR: Désolé pour la mise à jour - mais je veux en fait comparer la valeur d'une chaîne, disons string validateStr, aux valeurs contenues dans vector<T> Vals. J'ai donc besoin de connaître le type des valeurs stockées dans Vals, puis de comparer la chaîne en faisant soit (string to int) / (string to double) / (string (as is)) to each of the value in { {X3}}. Donc, fondamentalement, ce code vérifiera si la valeur _default est réellement l'une des valeurs présentes dans autorisé Vals.

0
legameeternoforall 8 août 2017 à 21:53

2 réponses

Meilleure réponse

Dans une boucle de plage, la "variable d'itération" a le type des éléments.
Ce n'est pas un itérateur.

Vous ne pouvez pas écrire la fonction comme ceci car la fonction entière doit être de type correct quel que soit T.

Ce que vous pouvez faire est d'utiliser une fonction surchargée (ou basée sur un modèle) et de lui transmettre la valeur:

void print(int i) { cout << "int " << i; }
void print(string s) { cout << "string " << s; }
// ...

for (auto v: Vals)
{
    print(v);
}
1
molbdnilo 8 août 2017 à 19:05

Tout d'abord, l'intérêt d'avoir un modèle est d'éviter ce que vous essayez de faire avec votre classe. Outre le fait que vous pouvez obtenir les mêmes résultats avec des modèles spécialisés, pourquoi ne pas essayer auto temp = *itr; ou mieux encore tapez cast (* itr) mais je vous conseillerai quand même d'essayer la spécialisation des modèles.

Un petit exemple d'extrait de code de spécialisation de modèle serait

template<typename T>
T add(T v1, T v2){
    return v1 + v2;
}

template <> double add(double v1, double v2){ return v1 + v2; }
template <> std::string add(std::string v1, std::string v2){ 
    return v1 + v2; 
}
template <> const char* add(const char* v1, const char* v2){ 
    return add(std::string(v1),std::string(v2)).c_str(); 
}

int main(){
    std::cout << add(1, 3) << std::endl;
    std::cout << add(2.6, 4.0) << std::endl;
    std::cout << add("str", "ing") << std::endl;    
}
0
Wells 8 août 2017 à 20:29