

|
 |
| Programming > C++ Moderated > Re: How to buil... |
|
| << Topic |
< Post |
Post 6 of 30 Topic 9533 of 9831
|
Post > |
Topic >> |
Re: How to build a string on the fly, using std::ostringstream?
by Brendan <catphive@[EMAIL PROTECTED]
>
Apr 24, 2008 at 03:43 PM
| On Apr 23, 12:14 pm, "Niels Dekker - no return address"
<nore...@[EMAIL PROTECTED]
> wrote:
> Does the Standard Library sup****t creating an std::string by means of
> streaming, without having to declare a *named* ostringstream object? I
tried
> the following:
>
> #include <sstream>
> #include <string>
> int i = 42;
>
> std::string s = (std::ostringstream() << "i = " << i).str();
>
> Of course it didn't compile, because a tem****ary (std::ostringstream())
cannot
> be passed as non-const reference to a function (operator<<). Okay,
second
> try, wrapping the ostringstream as follows:
>
> template <typename T> class Wrapper {
> T m_data;
> public:
> T & get() {
> return m_data;
> }
> };
>
> std::string s = (Wrapper<std::ostringstream>().get() << "i = " <<
i).str();
>
> Unfortunately it still didn't compile, because operator<< returns an
> std::basic_ostream, instead of an std::ostringstream, and therefore it
doesn't
> have an str() member function. Now I wonder, is it safe to cast the
stream,
> returned by operator<< to an ostringstream reference? As follows:
>
> std::string s =
> static_cast<std::ostringstream&>(Wrapper<std::ostringstream>().get()
> << "i = " << i).str();
>
> At least, it *seems* to work... But is it the proper way to do it?
I actually like your workaround, although you should typedef
Wrapper<std::ostringstream> to make it cleaner. I believe that
tem****aries are guaranteed to stick around until the next statement,
so you are good. Oh! also, overload << something like this:
std::string operator<<(basic_ostream& stream, ToStr& tstr) {
return static_cast<std::ostringstream&>(stream).str();
}
I haven't tested that, and obviously it isn't type safe, but since <<
is left associative you should be able to:
string x = temp_ostringstream().get() << "i = " << i << to_str;
where to_str is the single instance of ToStr.
Pretty nifty eh? There's probably some way to make getting the
tem****ary ostringstream easier, and maybe even making this statically
type safe, but it's late...
iostreams << are pretty lame for formatting syntactically speaking and
pretty much everybody ends up rolling their own formatting utility on
top of it.
Check out:
http://www.boost.org/doc/libs/1_35_0/libs/format/doc/format.html
which is basically a typesafe printf.
--
[ See http://www.gotw.ca/resources/clcm.htm
for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]


|
30 Posts in Topic:
|
"Niels Dekker - no r |
2008-04-23 13:14:37 |
|
Martin York <Martin.Yo |
2008-04-24 01:05:54 |
|
Peter Jones <dev-null@ |
2008-04-24 01:10:33 |
|
Carl Barron <cbarron41 |
2008-04-24 01:43:21 |
|
Vidar Hasfjord <vattil |
2008-04-24 15:12:53 |
|
Brendan <catphive@[EMA |
2008-04-24 15:43:20 |
|
Brendan <catphive@[EMA |
2008-04-25 10:22:59 |
|
Niels Dekker - no return |
2008-04-26 08:46:24 |
|
Carl Barron <cbarron41 |
2008-04-27 07:13:20 |
|
Brendan Miller <catphi |
2008-04-27 07:29:25 |
|
Vidar Hasfjord <vattil |
2008-04-27 07:29:42 |
|
Vidar Hasfjord <vattil |
2008-04-28 01:56:19 |
|
Vidar Hasfjord <vattil |
2008-04-28 02:13:22 |
|
vova777@[EMAIL PROTECTED] |
2008-04-28 16:06:27 |
|
"Niels Dekker - no r |
2008-04-28 16:01:35 |
|
guinness.tony@[EMAIL PROT |
2008-04-28 16:01:50 |
|
"Hendrik Schober&quo |
2008-04-28 20:35:47 |
|
Vidar Hasfjord <vattil |
2008-04-29 10:38:48 |
|
Brendan Miller <catphi |
2008-04-29 10:43:23 |
|
Vidar Hasfjord <vattil |
2008-04-29 10:43:23 |
|
Vidar Hasfjord <vattil |
2008-04-29 10:43:22 |
|
vova777@[EMAIL PROTECTED] |
2008-04-29 12:13:56 |
|
Vidar Hasfjord <vattil |
2008-04-29 17:41:45 |
|
Niels Dekker - no return |
2008-04-30 10:26:51 |
|
vova777@[EMAIL PROTECTED] |
2008-04-30 10:39:18 |
|
Vidar Hasfjord <vattil |
2008-04-30 17:04:43 |
|
guinness.tony@[EMAIL PROT |
2008-05-01 13:12:58 |
|
"Niels Dekker - no r |
2008-05-02 12:45:30 |
|
guinness.tony@[EMAIL PROT |
2008-05-07 11:43:29 |
|
"Niels Dekker - no r |
2008-05-08 21:29:05 |
|
Post A Reply:

|
|
|
|