Bonjour,
J'ai besoin d'utiliser la fonction value_or (librairie tomlplusplus). Pour simplifier, disons que j'ai besoin de l'appeler sur un bool.
Voici la fonction que je veux écrire :
Problème, cette fonction ne marche pas vu que dans value_or, default_value doit être une référence de rvalue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 auto toml::node::value_or(T&& default_value) const; // Signature de value_or // Ma fonction bool lireAvecValeurParDefaut(toml::table& t, const string& nomVal, bool defaut) { // Lit une valeur dans un table et la retourne, si la valeur n'existe pas elle retourne une valeur par défaut return t[nomVal].value_or<bool>(defaut); }
Je ne connaissais pas bien cette notion mais de ce que j'en ai compris les type T&& permettent de s'assurer que la ressource est temporaire et que la mémoire utilisée peut être récupérée par la fonction (n'hésitez pas à me corriger).
J'ai deux versions alternatives de ma fonction qui marchent, mais qui sont plus ou moins satisfaisantes :
Je préfère la version 3 parce que (sauf erreur de ma part) la version 2 fait une copie supplémentaire. Néanmoins, la version 3 mais ça m'a l'air "inutilement compliquée" et moins lisible que ma version initiale.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 bool lireAvecValeurParDefaut(toml::table& t, const string& nomVal, bool defaut) { return t[nomVal].value_or<bool>(bool(defaut)); // Version 2 return t[nomVal].value_or<bool>(std::move(defaut)); // Version 3 }
Par exemple, j'avais pensé à faire passer "defaut" comme une référence de rvalue :
Mais là non plus ça ne fonctionne pas, vu qu'il estime que defaut peut être utilisée ailleurs dans ma fonction (si j'ai bien compris).
Code : Sélectionner tout - Visualiser dans une fenêtre à part bool lireAvecValeurParDefaut(toml::table& t, const string& nomVal, bool&& defaut)
Donc voici ma question, est-il possible de faire autrement que ces deux solutions qui marchent ? Est ce qu'il y a quelque chose de fondamental qui m'échappe ?
Merci d'avance
Partager