J'ai une fonction que j'aimerais généraliser. Il suffit de mettre, j'ai un Le vecteur doit contenir les valeurs transformées. P> Je suis coincé avec le dernier paramètre de Toute astuce? P> std :: string s code> que je traite avec un analyseur générant un
std :: vecteur
std :: vecteur
t code> restreint à
Double code> ou
int code>.
std :: transformer code>, car il doit basculer entre
std :: stod code> et
std :: Stoi code>. La solution que je cherche est avec Modèle métaprogramming em> magique, non pas avec
si (std :: isame
template <class T>
auto get_vector(std::string s) -> std::vector<T>
{
std::vector<T> v;
auto tmp = split(s);
std::transform(tmp.begin(), tmp.end(), std::back_inserter(v), ??);
return v;
}
3 Réponses :
Une chose que vous pourriez faire est d'utiliser un stringstream code>
et a < Un href = "http://fr.cppreference.com/w/cpp/language/LAMBDA"> lambda et avoir le stringstream code> faire la conversion pour vous. Quelque chose comme
Ne faites que cela si la quantité de données est très petite de sorte que vous ne vous souciez pas si elle est ridiculement lente.
Utilisation de iStream_iterator code>:
Expédition à std :: stoi code> et
std :: stod code> via Modèle de fonction Spécialisation:
template <typename T>
auto parse_number(std::string const& s) -> T;
template <>
auto parse_number<int>(std::string const& s) -> int
{
return std::stoi(s);
}
template <>
auto parse_number<double>(std::string const& s) -> double
{
return std::stod(s);
}
template <class T>
auto get_vector(std::string const& s) -> std::vector<T>
{
std::vector<T> v;
auto tmp = split(s);
std::transform(tmp.begin(), tmp.end(), std::back_inserter(v), &parse_number<T>);
return v;
}
C'est la réponse. En bref, OP doit appeler certains_lexical_caster
parse_number code> est tout simplement bien.
La réponse d'A.S.H. est intriguée et me permet d'éviter les spécialisations. Y a-t-il des inconvénients?
@senseiwa oui, std :: stringstream code> peut être beaucoup plus lent. Cela dépend vraiment de l'efficacité de votre
Split code>.
@senseiwa, aussi je ne suis pas sûr de ce que StringStream va faire avec des virgules dans votre chaîne. À peu près sûr qu'il ne fonctionne pas.
@senseiwa Il n'y a pas de problème à propos de la vitesse, cela ne dépend que si vous préférez de simples solutions directes ou celles qui créent 3 déclarations de modèle pour effectuer deux fonctions de ligne unique.
Ajoutez une spécialisation pour
double code>?