6
votes

Vecteur de la fonction Modèle Doubles / Ints

J'ai une fonction que j'aimerais généraliser. Il suffit de mettre, j'ai un std :: string s code> que je traite avec un analyseur générant un std :: vecteur code> (c'est une liste comme dans "1, 2, 3" code>), et la fonction doit renvoyer un std :: vecteur code>, avec t code> restreint à Double code> ou int code>.

Le vecteur doit contenir les valeurs transformées. P>

Je suis coincé avec le dernier paramètre de 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 :: valeur) p> p>

Toute astuce? P>

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;
}


1 commentaires

Ajoutez une spécialisation pour double ?


3 Réponses :


5
votes

Une chose que vous pourriez faire est d'utiliser un stringstream et a < Un href = "http://fr.cppreference.com/w/cpp/language/LAMBDA"> lambda et avoir le stringstream faire la conversion pour vous. Quelque chose comme xxx


1 commentaires

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.



3
votes

Utilisation de iStream_iterator : xxx


0 commentaires

7
votes

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;
}


5 commentaires

C'est la réponse. En bref, OP doit appeler certains_lexical_caster (const std :: string &) . En fait, vous pourriez aussi bien utiliser Boost si cela a besoin de solution plus générale. Mais, à nos fins ici, ce parse_number 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 peut être beaucoup plus lent. Cela dépend vraiment de l'efficacité de votre Split .


@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.