J'ai une classe intitulée Eclipse
avec un membre struct privé contenant ~ 30 champs de différents types de données.Méthode d'écriture avec le type de retour arrière à modifier en fonction de l'appel de la méthode?
J'ai une méthode qui retournera un champ de données de la structure, basé sur un nombre de champ passé en tant que paramètre. Voyant que la structure contient des données de différents types, j'ai choisi d'utiliser le mot-clé auto
avec un type de retour arrière basé sur un paramètre basé sur un modèle. Mon en-tête de méthode est ci-dessous.
template<typename TheType>
auto getColumnData(TheType toGet, int fieldNum) -> decltype(toGet) {
// switch statement to return fields based on fieldNum
}
Si je veux retourner une colonne qui est un int
, j'appelle getColumnData(0, 1);
. Le premier paramètre est uniquement utilisé pour déterminer le type de retour de la méthode et le deuxième paramètre détermine le numéro de champ à renvoyer à l'appelant de la méthode.
En théorie, le type de retour getColumnData()
serait int
et renvoyer la première colonne (correspondant au premier champ) de la structure. Mais je reçois cette erreur de compilation:
no viable conversion from returned value of type 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') to function return type 'decltype(toGet)' (aka 'int')`
Je comprends que si je devais appeler cette méthode avec un int
comme premier paramètre, et un numéro de champ qui correspond à un champ de retour d'un std::string
, il y aurait problèmes. Mais, basé sur des vérifications dans d'autres classes, ce cas ne se produirait jamais.
Est-il possible de forcer mon compilateur à accepter ce code, même si cela peut ne pas être correct dans certains cas?
Je sais que je pourrais juste surcharger la méthode, mais je préfère ne pas avoir plusieurs méthodes différentes pour essentiellement le même but si je peux comprendre comment accomplir la tâche dans un seul.
Aussi, si ma compréhension de l'une de ces informations semble incorrecte, s'il vous plaît faites le moi savoir. Je suis très nouveau en C++, donc je suis en train d'apprendre ces fonctionnalités au fur et à mesure.
Ceci est complètement incorrect. Si le premier paramètre est un 'int', le' decltype' spécifie que la fonction renvoie un 'int', par définition. Arrêt complet. Fin de l'histoire. Tout ce que vous avez écrit à partir de là n'est pas pertinent. La fonction de modèle instancié doit renvoyer un 'int', no ifs, ands ou buts. –