Comment l’opérateur << avec boost :: variant est implémenté

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 .