Boost.FusionのカスタムIOフォーマットをもとに戻す

あまり必要になることはないと思いますが、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)