あまり必要になることはないと思いますが、Boost.IO State Saversを使えば戻せそうだったのでやってみました。
detail名前空間以下を使うことになってしまったので、使用する場合は自己責任で。
#include <iostream> #include <boost/fusion/include/vector.hpp> #include <boost/fusion/include/io.hpp> #include <boost/io/ios_state.hpp> template <class Ostream, class FusionSequence> void output_sequence(Ostream& os, const FusionSequence& seq) { // スコープを抜けたらフォーマットを戻す boost::io::ios_pword_saver open_saver( os, boost::fusion::detail::get_xalloc_index<boost::fusion::detail::tuple_open_tag>() ); boost::io::ios_pword_saver close_saver( os, boost::fusion::detail::get_xalloc_index<boost::fusion::detail::tuple_close_tag>() ); boost::io::ios_pword_saver delimiter_saver( os, boost::fusion::detail::get_xalloc_index<boost::fusion::detail::tuple_delimiter_tag>() ); // カスタムフォーマットを設定 os << boost::fusion::tuple_open('['); os << boost::fusion::tuple_close(']'); os << boost::fusion::tuple_delimiter(", "); os << seq << std::endl; } int main() { const boost::fusion::vector<int, char, std::string> v(1, 'a', "Hello"); output_sequence(std::cout, v); std::cout << v << std::endl; }
[1, a, Hello] (1 a Hello)