Bonjour,
Je développe des systèmes embarqués. j'utilisais le C, mais, maintenant que les microcontrolleurs sont puissant (le miens tourne a 192MHz, à 128ko de ram et 2Mo de flash) je suis passé sur le C++(11). Je ne suis donc pas encore un "guru" C++.
En C je stockais les paramètres généraux de mon programme dans une grosse struct, que j’insérais en flash, et que je j'allais chercher au démarrage. A chaque que fois que je rajoutais un paramètre, il fallait mettre à jour la structure, mettre en place une méthode pour le chargement en prenant en compte le fait que la structure en flash était peut être une ancienne version, bref, pas très "powerful" (mais sa marche).
Avec le C++, j'ai eu une idée. Une structure générique comme ceci :
1 2 3 4 5 6 7 | struct Parameter_t { Parameter_e m_id; Type_e m_type; char m_key[20]; void* m_value; }; |
Parameter_e et Type_e sont des enum. J'ai une classe "Parameter" qui contient un std::vector<Parameter_t>. J'ai ensuite un setter pour chaque type que je pourrais rencontrer :
1 2 3 | Parameter::Set(Parameter_e p_param_e, uint32_t p_value); Parameter::Set(Parameter_e p_param_e, const char * p_value); //etc... |
Et pour le getter c'est un peu plus complexe, j'ai fait une template :
1 2 3 4 5 | template<typename T> T Parameter::Get(Parameter_e p_param_e) { return *(static_cast<T*>(Parameter::getInstance()->m_parameterList[p_param_e].m_value)); } |
(Parameter est un Singeleton, mais ce n'est pas vraiment important). On doit connaitre le type du paramètre, que l'on va chercher, mais ce n'est pas très grave.
En pratique cela fonctionne mal, il faudrait faire une map, mais avec des type différent c'est pas vraiment possible. Une des solutions aurait été de tous convertir en chaine de caractères. Même si j'ai un embarqué assez puissant, cela reste un embarqué, j'aimerais ne pas trop alourdir la bête.
Si vous avez une idée élégante pour ce type de problème… J'ai vu des choses sur le type erasure, mais je n'ai pas compris comment je pouvais le mettre en oeuvre.
d'avance merci.