blob: 53929d085b4b48033571c35636138cd1f7d4bad9 [file] [log] [blame]
<HTML>
<HEAD>
<TITLE>Patterns for Extractors and Inserters of User-Defined Types</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="32-5.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="33.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library User's Guide</B></DIV>
<H2>32.6 Patterns for Extractors and Inserters of User-Defined Types</H2>
<A NAME="idx796"><!></A>
<P>Here is the pattern for an extractor:</P>
<UL><PRE>
template&lt;class charT, class Traits&gt;
std::basic_istream&lt;charT, Traits&gt;&amp;
operator&gt;&gt; (std::basic_istream&lt;charT,
Traits&gt;&amp; is, UserDefinedType&amp; x)
{
std::ios_base::iostate err = 0;
// Create a sentry object (may set error bits or throw failure)
typename basic_istream&lt;charT, Traits&gt;::sentry ipfx(is);
try {
// Proceed with I/O only if sentry is okay.
if(ipfx) {
// Typically you access the stream's locale or buffer.
// Don't call other stream I/O functions.
// Add state bits to the err variable if necessary,
// for example:
// if (...)
// err |= std::ios_base::failbit;
}
}
catch(...) {
bool flag = false;
try {
// set failbit (may throw failure)
is.setstate(std::ios_base::failbit);
}
catch(...) { flag = true; }
// Re-throw original exception (thrown from facet or buffer)
if (flag)
throw;
}
// As the last step, set error bits (may throw failure)
if (err)
is.setstate(err);
return is;
}
</PRE></UL>
<A NAME="idx797"><!></A>
<P>Similarly, the pattern for the inserter looks like this:</P>
<UL><PRE>
template&lt;class charT, class Traits&gt;
std::basic_ostream&lt;charT, Traits&gt;&amp;
operator&lt;&lt;(std::basic_ostream&lt;charT, Traits &gt;&amp; os,
const UserDefinedType&amp; x)
{
std::ios_base::iostate err = 0;
// Create a sentry object (may set error bits or throw failure)
typename basic_ostream&lt;charT, Traits&gt;::sentry opfx(os);
try {
// Proceed with I/O only if sentry is okay
if (opfx) {
// Typically you access the stream's locale or buffer.
// Don't call other stream I/O functions
// Add state bits to the err variable if necessary,
// for example:
// if (...)
// err |= std::ios_base::failbit;
// Reset the field width after usage, that is,
// os.width(0);
}
} //try
catch(...) {
bool flag = false;
try {
// set failbit (may throw failure)
os.setstate(std::ios_base::failbit);
}
catch(...) {
// Catch exception, do not rethrow
flag = true;
}
// Rethrow original exception (from facet or buffer)
if (flag)
throw;
}
// As the last step, set error bits (may throw failure)
if (err)
os.setstate(err);
return os;
}
</PRE></UL>
<BR>
<HR>
<A HREF="32-5.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="33.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>
<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1775151-1";
urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->
</BODY>
</HTML>