Terje Slettebų wrote:
> 
> >From: "Jason House" <[EMAIL PROTECTED]>
> 
> > Terje Slettebų wrote:
> > > In a way, something good came from it, as well: I've recently looked at
> > > Boost.Tuple, and I see that they have I/O operators defined (in
> > > tuple_io.hpp).
> >
> > Well, it definitely seems like the tuples were thinking along similar
> > lines with a start, middle, and stop delimiters.
> > The documentation brings up a point about parseability of data streams.
> > It doesn't quite make sense to me that there should be restriction to a
> > single character in order to to make things uniquely parseable.  If it's
> > a fixed sequence of characters, I don't see how that makes it any
> > significantly less parseable...  Maybe I'm missing something?
> 
> The docs says:
> 
> "Note that extracting tuples with std::string or C-style string elements
> does not generally work, since the streamed tuple representation may not be
> unambiguously parseable."
> 
> It's not about the delimiters. which it seems you mean, but about the tuple
> elements. Consider:
> 
> tuple<std::string,int> test;
> 
> stream >> test; // Stream contains "a string, with comma, 123"
> 
> Here, it can't know that the first comma is part of the string, and not
> meant to separate elements. Not to mention that it would stop after "a", due
> to the space character.


you're right... I was thinking that they were referring to the
delimiters not being strings (and forced to be just characters).  If the 


> I agree that it should be possible to have multi-character delimiters,
> without creating parsing problems. It could be an idea to keep this, as it
> may make for more flexible output. Even single-character delimiters is quite
> flexible, as you can even get each element on its own line, by using '\n' as
> the element separator. To look again at one example of how the tuple way
> might work:
> 
> std::vector<std::pair<char,int> > test;
> 
> std::cout << test: // Using defaults
> 
> (('A',1),('B',2),('C',3))


I would suspect that chars don't get output with '' around them...
Is there even a way to specify/change that?  Something similar for
strings (along with an escape character) would be very handy for
strings.  Inside C++ code, a start and stop character of " and an escape
of \ is used...  I am not familiar with what serialization code is
available, but I would suspect there might be a feature like that
already in there somewhere.


> In this case, it's not possible to set the format for each type separately.
> Maybe it could be good to keep that feature of the current composite
> operators, as well, something like:
> 
> typedef std::pair<char,int> map;
> typedef std::vector<Map> map_list;
> 
> map_list test;
> 
> std::cout << io::set_delimiter<map>("\n") << test;
> 
> Output:
> 
> (('A',1)
> ('B',2)
> (C,3))


so basically, you would like to combine tuple-like output specification
(ie for all tuples) and type specific such as composite_format?


> You might also have a non-template overload of the manipulators, which sets
> the delimiters for all types, as done in tuples.
> 
> This may also have a positive effect on a serialisation library: The
> standard types will have default stream operators.
> 
> > It does enable defaults and allows a way to customize each spacer
> > individually, which is a good addition.  I think the ability to set all
> > 3 also is a must-have :)
> 
> Yeah, I think that's useful, too. :)
> 
> > The tuple functions, as provided should be extremely easy to call from a
> > debugger since there is no templating going on.
> 
> Actually, there is. They are defined in tuple_io.hpp as:
> 
> template<class CharType, class CharTrait, class T1, class T2>
> inline std::basic_ostream<CharType, CharTrait>&
> operator<<(std::basic_ostream<CharType, CharTrait>& o,
>            const cons<T1, T2>& t)
> 
> As you say, this may be a problem to call from a debugger, unless it
> supports calling function templates. If one need to call it from a debugger,
> one could always wrap the code in a function.


:(
Debugger friendly manipulation would be good.  I still haven't thought
about how exactly outputting of an arbitrary composite variable will
work in the debugger by default...  I agree that having a wrapper makes
it easy for the output formatting of general types, but actually being
able to execute "std::cout << my_suspect_variable" in the debugger
without premeditation still poses a significant problem.  Why can't bugs
be predicted before you notice them?


> There was a suggestion for allowing generic formats, though, using
> the same format for all instantiations of a template. The question is how to
> do it. The current version stores the format for each specific type, as you
> say. Volodya suggested a couple of ways it could be done, partial
> specialisation, or storing the template name in a map. However, it could be
> hard to use the latter, as it could be hard to find the right type to look
> up, when outputting, given that you have specific types, not templates.
> 
> Overloading of class templates might have helped, here. E.g.:
> 
> std::cout << io::set_format<std::vector<std::pair<char,int> >(...); // Set
> specific format (io::format is a class template)
> std::cout << io::set_format<std::vector>(...); // Set generic format for
> std::vector (io::format overloaded with a version taking template template
> parameter, and specialised for std::vector)

Well, <std::vector> would cause trouble because the std::vector requires
extra arguments...  I don't think you could get that to compile.  Using
a string might work... but using it as a template argument would
probably cause trouble.  I don't know if there is a way to use partial
template specialization.  There was a recent post about converting type
names to strings...  something like that could be a solution...  I don't
like having to specify a name for each type necessarily though...

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to