Re: "Type-safe" sprintf
On Thu, 8 Mar 2007 14:53:29 +0100, Daniel Lidstr?m wrote:
Here is the implementation of my sprintf-like function.
I simplified the implementation a little bit, so that the first argument
fed to cool::sprintf has to be the format string. This is to prevent errors
like:
cool::sprintf(buffer) % 1 % "%d";
already at compile time.
Here's the updated version:
namespace cool
{
namespace detail
{
template<class Char>
class feeder
{ };
template<class Char, std::size_t N>
class feeder<Char[N]>
{
typedef typename boost::basic_format<Char> format_type;
typedef typename std::basic_string<Char> string_type;
format_type format;
Char* buffer;
public:
feeder(Char* b)
: buffer(b)
{ }
~feeder()
{
string_type result = str(format);
if( result.size()>=N )
throw std::logic_error("buffer overflow in sprintf");
std::copy(result.begin(), result.end(), buffer);
buffer[result.size()] = 0;
}
//! Format string
format_type& operator%(const Char* c)
{
format.parse(c);
return format;
}
};
}
template<class Source>
typename detail::feeder<Source> sprintf(Source& buffer)
{
typedef typename detail::feeder<Source> Feeder;
return Feeder(buffer);
}
}
--
Daniel
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?