Boost logo

Boost Users :

Subject: Re: [Boost-users] [fusion] adapted std::pair and ostream
From: Nathan Ridge (zeratul976_at_[hidden])
Date: 2011-07-19 15:40:47


> The docs:
>
> http://www.boost.org/doc/libs/1_47_0/libs/fusion/doc/html/fusion/adapted/std__pair.html
>
> seem to suggest that one can pipe an adapted std::pair 'directly' to cout.
>
> I find the following though:
>
> #include <iostream>
> #include <boost/fusion/adapted.hpp> // adapt pair.
> #include <boost/fusion/sequence.hpp> // operator<<() ?
> #include <boost/fusion/container.hpp> // as_vector
>
> int main(int argc, char** argv)
> {
> std::pair<std::string, int> p("foo", 7);
>
> std::cout << p << std::endl; // does not compile although docs
> suggest it should.
> std::cout << boost::fusion::as_vector(p) << std::endl; //
> compiles and works as expected.
>
> return 0;
> }
>
> Am I missing an include? Is sending to cout without first using
> as_vector actually supported?

Hmm... well boost/fusion/sequence/io/out.hpp (which is included
by boost/fusion/sequence/io.hpp which is in turn included by
boost/fusion/sequence.hpp) does define the correct operator<<
for all sequences, but it's in the boost::fusion namespace, and I
don't see it being exported into the global namespace anywhere.

If you add "using boost::fusion::operator<<;" to your code, it
works fine.

But this seems to be in contradiction with the docs, which say [1]
(emphasis mine):

The **global** operator<< has been overloaded for generic
          
output streams such that Sequence(s)
          are output by recursively
calling operator<< for each element.

Perhaps the authors were relying on ADL to find operator<<,
but overlooking the fact that not all sequences would be in the
boost::fusion namespace?

Regards,
Nate.
                                               



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net