Why I love C++ so much.

Warren Young warren@etr-usa.com
Thu Feb 21 12:27:00 GMT 2008


Corinna Vinschen wrote:
> 
> Really?  Show me an example which isn't much harder to understand than
> the equivalent C code.

template <class T>
std::string foo(const T& x)
{
     std::ostringstream outs;
     outs << x << and << maybe << other << stuff;
     return outs.str();
}

(Aside: This looks pointlessly trivial, but it's a simplified version of 
real code in MySQL++ (http://tangentsoft.net/mysql++/).  It would just 
muddy the waters to talk about the reason MySQL++ does this.)

To do that with C functions (maybe strto*() instead of printf()) you'd 
have to create a set of template specializations for every T you know 
about to call the right C function with the right arguments.  Any time 
you add to the list of supported T's, you have to add template 
specializations.

The main thing IOStreams gives you is type safety.  If your types are 
all portable C primitive types and they're known at compile time, by all 
means, use C functions for string conversions.  IOStreams is nearly 
useless if you don't use data types that K&R didn't give you.

This includes not just user-defined types, but also unportable ones like 
the various ways to get a 64-bit integer.  Not all C++ compilers fully 
support C99, so you can't count on having long long.  VC++ uses __int64, 
for instance.  As long as the compiler vendor provides operator <<() for 
the type you want to use, you don't have to introduce more unportable 
facilities to your code to do something like the T-to-string conversion 
above.  The compiler figures out how to do it for you, and if it changes 
in the future, you just recompile.



More information about the Cygwin-talk mailing list