Really? Thank you for that tip! That brings me to a few questions (I was just testing it and couldn't get it to work quickly). What is the sink? I think i can just replace that with cout, right? Actually, no, that gets me an compile error "boost/spirit/home/karma/detail/output_iterator.hpp(295) : error C2675: unary '++' : 'std::ostream' does not define this operator or a conversion to a type acceptable to the predefined operator".
ok, what i got now is:
#include
namespace bk = boost::spirit::karma; namespace ba = boost::spirit::ascii; vector<string> vsUnrecog = collect_unrecognized(parsed.options,po::exclude_positional); bk::generate(cout, "Option \"" << ba::string % '\" not recognized' << bk::eol, vsUnrecog); Where do those sinks come from and how do I make a simple sink that writes to stdout, just like cout does?
I used 'sink' as a placeholder for any output iterator, so in your case the easiest is to construct an ostream_iterator<char>(cout).
By the way, doen't your code both use ";" and newline (eol) as delimiters?
';' is used as the delimiter in between the elements of the vector (string % ';': in Spirit operator% is used as the shortcut for 'list'), and eol is used as the closing newline. Regards Hartmut
Best, Dee
On Mon, Aug 24, 2009 at 10:42 AM, OvermindDL1
wrote: On Sun, Aug 23, 2009 at 8:20 PM, Diederick C. Niehorster
wrote: The same way that you would stream any normal vector: vector<string> &files = vm["file"].as< vector<string> >(); vector<string>::const_iterator iter = files.begin(); cout << "Files selected: "; for(;iter!=files.end();++iter) { cout << *iter << ";"; } cout << "\n";
Consequently, if you have Boost trunk installed, then you could do this as well since it does support streaming vectors: #include
using namespace boost::spirit::karma; using namespace boost::spirit::ascii; generate(cout, "Files selected: " << (*char_)%';' << eol, vm["file"].as< vector<string> >());
Or you could simply do: #include
cout << "Files selected: "; BOOST_FOREACH(string& sFile, vm["file"].as< vector<string> >()) cout << sFile.c_str() << endl; That is assuming you wanted an endl at the end of each name, a usual delimiter is something like ';' or so, so this instead: cout << "Files selected: "; BOOST_FOREACH(string& sFile, vm["file"].as< vector<string> >()) cout << sFile.c_str() << ";"; cout << "\n";
Although the karma version that Hartmut posted is still the fastest way to do it (in terms of execution speed): generate(sink, "Files selected: " << string % ';' << eol, vm["file"].as< vector<string> >()); _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users