Je comprends que boost::variant
est implémenté quelque chose comme ça
template struct variant { std::aligned_union::type buffer; .... };
Comment pouvons-nous créer un operator<<
pour une structure comme celle-ci qui imprime le type stocké dans le tampon et le transmet à l’ operator<<
pour cout
? Pour cela, nous aurions besoin de connaître le type d’élément stocké dans la mémoire tampon, non? Y a-t-il un moyen de savoir cela?
Aussi, je cherche une explication sur une telle implémentation, s’il en existe une. Pas seulement qu’il existe et comment je peux l’utiliser.
Boost a une fonction apply_visitor
, qui prend un object de fonction générique et lui passe le type du variant. Donc, implémenter l’ operator<<
est aussi simple que:
template std::ostream& operator<<(std::ostream& os, boost::variant const& var) { return boost::apply_visitor(ostream_visitor{os}, var); }
avec:
struct ostream_visitor : boost::static_visitor { std::ostream& os; template std::ostream& operator()(T const& val) { return os << val; } };
Ou simplement:
template std::ostream& operator<<(std::ostream& os, boost::variant const& var) { return boost::apply_visitor([&os](const auto& val) -> std::ostream& { return os << val; }, var); }
Vous pouvez voir d'autres exemples dans le tutoriel .