Boost logo

Boost :

From: Joel de Guzman (joel_at_[hidden])
Date: 2006-06-10 13:04:34


Oleg Abrosimov wrote:
> Hello dear authors of boost tuple libraries!
>
> I've a need to implement a function that gets a tuple of manipulators
> and applies them to stream:
>
> template <typename T, typename Tuple>
> std::string string_from(T const& t, Tuple const& manip)
> {
> std::stringstream ss;
> ss << manip << t;
> return ss.str();
> }
>
> usage of this function would be:
>
> std::string s = string_from(1.2, boost::make_tuple(std::setprecision(2),
> std::scientific));
>
> The problem is: how I can efficiently suppress output of
> left/right/delimiter strings?
> Of cause, with fusion::tuple I can do the following (manipulator names
> are taken from boost::tuple docs, though):
>
> template <typename T, typename Tuple>
> std::string string_from(T const& t, Tuple const& manip)
> {
> std::stringstream ss;
> ss << set_open("") << set_close("") << set_delimiter("") << manip << t;
> return ss.str();
> }
>
> but it has a lot of overhead in tuple's output iterator that should be
> avoided for me.
>
> I feel that the best solution would be to have a function
> "print_tuple(stream, tuple)" in tuples library that just do what I want.

With Fusion, this is easy. Using lambda/phoenix:

     fusion::for_each(tup, std::cout << _1);

If you want it to be a function (using plain-ole functors):

     namespace detail
     {
         template <class Out>
         struct my_printer
         {
             printer(Out& out) : out(out) {}

             template <class T>
             void operator()(T const& val) const
             {
                 out << val;
             }
             Out& out;
         };
     }

     template <class Out, class Tuple>
     Out& print_tuple(Out& out, Tuple const& tup)
     {
         fusion::for_each(tup, detail::my_printer<Out>(out));
     }

> One more issue with fusion::tuple manipulators as they are in boost
> 1.33.1 (unofficially): I've discovered that only narrow strings and
> characters are supported. am I right? If so, I believe that wide
> versions should be added too.

Hmmm... Have you tried? Those are templated on Char type AFICT.
I have to admit not testing that though. The Fusion I/O tests
are simply those from Boost.Tuples. Added in my TODO list.

Regards,

-- 
Joel de Guzman
http://www.boost-consulting.com
http://spirit.sf.net

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk