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