Je développe un langage de script en C++ qui utilise des fonctions "intégrées" dans l'interpréteur. J'utilise la construction suivante pour mapper les noms de fonction à leurs pointeurs respectifs:Population automatique de std :: map avec des pointeurs de fonction
typedef void(*BuiltInFunction)(Context*);
typedef std::unordered_map<std::string, BuiltInFunction> BuiltinFunctionsMap;
où Context
est une classe personnalisée.
J'ai des déclarations de fonctions comme celle-ci:
namespace BuiltIns {
void _f_print(Context* context);
void _f_error(Context* context);
void _f_readline(Context* context);
void _f_read(Context* context);
void _f_readchar(Context* context);
void _f_eof(Context* context);
...
}
Et enfin une routine qui remplit la carte avec les pointeurs réels:
BuiltinFunctionsMap BuiltIns::populateFunctions() {
BuiltinFunctionsMap funcMap;
// Standard I/0
funcMap["print"] = &BuiltIns::_f_print;
funcMap["error"] = &BuiltIns::_f_error;
funcMap["readline"] = &BuiltIns::_f_readline;
funcMap["read"] = &BuiltIns::_f_read;
funcMap["readchar"] = &BuiltIns::_f_readchar;
funcMap["eof"] = &BuiltIns::_f_eof;
...
return funcMap;
}
Ce que je vous demande est de savoir s'il y a un moyen de générer automatiquement la fonction de population à partir de la déclaration de fonction en utilisant des modèles ou quelque chose de similaire. Actuellement, j'utilise une expression régulière, ce qui est assez simple mais je dois le faire chaque fois que j'ajoute de nouvelles fonctions et que c'est lourd.
Je suis assez nouveau pour C++. Je serais très heureux d'envisager une meilleure solution :) – Tibor
'std :: function' est votre ami. Ce peut être un pointeur de fonction ou un objet fonction, ce qui signifie qu'il peut y avoir beaucoup, beaucoup de choses. Les pointeurs de fonction sont incroyablement restrictifs, alors que 'std :: function' permet beaucoup de liberté. – Puppy
Si vous pouvez le faire avec des expressions régulières, ne pouvez-vous pas ajouter cela comme une étape dans votre processus de construction? – alexisdm