J'ai besoin de convertir une chaîne qui représente un vecteur de T
s dans le vecteur correspondant.Passer la fonction avec les valeurs par défaut comme argument les ignorer
Mon problème est que je voudrais passer un argument simple: la fonction de convertisseur. Voici le split
:
template <class T>
auto split(const std::string &s, const std::function<T(const std::string&)> &convert, char sep = ',') -> std::vector<T>
{
std::stringstream ss(s);
std::vector<T> result;
while (ss.good())
{
std::string substr;
std::getline(ss, substr, sep);
if (!substr.empty())
result.push_back(convert(substr));
}
return result;
};
Il ne peut pas compiler lors du passage des fonctions standard telles que std::stoi
en raison des paramètres par défaut de std::stoi
que sa signature est int stoi(const string& __str, size_t* __idx = 0, int __base = 10);
:
auto q = split<int>(subs, std::stoi);
error: no matching function for call to 'split'
auto q = split<int>(subs, std::stoi);
^~~~~~~~~~
Et je ne peux évidemment tromper le compilateur par en utilisant une fonction lambda:
auto q = split<std::size_t>(subs, [](const std::string &s){ return std::stoul(s); });
Y at-il un truc de métaprogrammation qui me permet de som ehow ignorer les paramètres par défaut?
Vous avez explicitement spécifié que vous voulez 'split'. –
nwp
Je veux dire que 'std :: stoi', en fait, a des paramètres par défaut: la signature est' int stoi (chaîne const & __str, taille_t * __idx = 0, int __base = 10); '. J'espère ignorer cette signature par défaut. – senseiwa
Si vous ne pouvez pas utiliser std :: function, cela vous facilitera la vie. (Un paramètre de fonction basé sur un modèle serait préférable.) – alfC