En C++ 17, j'implémente un vm jouet. J'utilise un std :: variant() comme les éléments de la pile de VM. Je dois pousser des chaînes sur la pile qui représentent différents types d'opérandes, à savoir:std :: variant stocke plusieurs types de chaînes et les différencie
- un nom de variable
- un identifiant
- une chaîne entre guillemets
Tous les 3 types d'opérandes peuvent être de type std :: string_view. La variante est définie comme ceci:
std::variant<bool, int, double, std::string_view>;
Afin de discriminer le type de vue chaîne réelle, est la bonne façon de faire quelque chose comme ça?
enum StringKind { Symbol, String, Var };
using Stringy = std::tuple<StringKind, std::string_view>; // SV can be symbol, var, string
std::variant<bool, int, double, Stringy>;
Ou est-il possible d'encoder le type de chaîne directement sur le variant. L'un des avantages de le faire au niveau de la variante est que le type peut être obtenu en appelant std :: variant :: index(). Sinon, je dois vérifier .index() == 3, std :: get < 3> (var), puis inspecter le type pour voir si sa chaîne, symbole, ou var.