<HTML>
<HEAD>
<TITLE>Negators</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="negate.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="new-h.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>Negators</H2>
<P><B>Library:</B>&nbsp;&nbsp;<A HREF="2-4.html">General utilities</A></P><UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Synopsis</A></LI>
<LI><A HREF="#sec4">Description</A></LI>
<LI><A HREF="#sec5">Interface</A></LI>
<LI><A HREF="#sec6">Example</A></LI>
<LI><A HREF="#sec7">See Also</A></LI>
<LI><A HREF="#sec8">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
No Entries
<A NAME="sec2"><H3>Summary</H3></A>
<P>Function adaptors and function objects used to reverse the sense of predicate function objects</P>
<A NAME="sec3"><H3>Synopsis</H3></A>

<PRE>#include &lt;functional&gt;

namespace std {
  template &lt;class Predicate&gt;
  class unary_negate;

  template &lt;class Predicate&gt;
  unary_negate&lt;Predicate&gt; not1(const Predicate&amp;);

  template &lt;class Predicate&gt;
  class binary_negate;

  template &lt;class Predicate&gt;
  binary_negate&lt;Predicate&gt; not2(const Predicate&amp;);
}
</PRE>
<A NAME="sec4"><H3>Description</H3></A>
<P>Negators <SAMP><A HREF="not1.html">not1()</A></SAMP> and <SAMP><A HREF="not2.html">not2()</A></SAMP> are functions that take predicate function objects as arguments and return predicate function objects with the opposite sense. Negators work only with function objects defined as subclasses of the classes <B><I><A HREF="unary-function.html">unary_function</A></I></B> and <B><I><A HREF="binary-function.html">binary_function</A></I></B>. <SAMP>not1()</SAMP> accepts and returns unary predicate function objects. <SAMP>not2()</SAMP> accepts and returns binary predicate function objects.</P>
<P><B><I><A HREF="unary-negate.html">unary_negate</A></I></B> and <B><I><A HREF="binary-negate.html">binary_negate</A></I></B> are function object classes that include return types for the negators, <SAMP><A HREF="not1.html">not1()</A></SAMP> and <SAMP><A HREF="not2.html">not2()</A></SAMP>.</P>
<A NAME="sec5"><H3>Interface</H3></A>

<UL><PRE>namespace std {

  template &lt;class Predicate&gt;
  class unary_negate
    : public unary_function
             &lt;typename Predicate::argument_type, bool&gt; {

  public:
    explicit unary_negate (const Predicate&amp;);
    bool operator() (const argument_type&amp;) const;
  };

  template&lt;class Predicate&gt;
  unary_negate &lt;Predicate&gt; not1(const Predicate&amp;);
}
template&lt;class Predicate&gt;
class binary_negate
  : public binary_function
           &lt;typename Predicate::first_argument_type,
            typename Predicate::second_argument_type, bool&gt;
{
public:
  explicit binary_negate (const Predicate&amp;);
  bool operator() (const first_argument_type&amp;,
                   const second_argument_type&amp;) const;
};

template &lt;class Predicate&gt;
binary_negate&lt;Predicate&gt; not2 (const Predicate&amp;);
</PRE></UL>
<A NAME="sec6"><H3>Example</H3></A>

<UL><PRE>//
//  negator.cpp
//

#include &lt;functional&gt;   // for unary_function
#include &lt;iostream&gt;     // for boolalpha, cout, endl


// Create a new predicate from unary_function.
template &lt;class Arg&gt;
struct is_odd : public std::unary_function&lt;Arg, bool&gt;
{
    bool operator() (const Arg &amp;arg1) const {
        return arg1 % 2 != 0;
    }
};


int main ()
{
    std::less&lt;int&gt; less_func;

    // Use not2 on less.
    std::cout &lt;&lt; std::boolalpha
              &lt;&lt; less_func (1, 4) &lt;&lt; '\n'
              &lt;&lt; less_func (4, 1) &lt;&lt; '\n'
              &lt;&lt; std::not2 (std::less&lt;int&gt;())(1, 4) &lt;&lt; '\n'
              &lt;&lt; std::not2 (std::less&lt;int&gt;())(4, 1) &lt;&lt; '\n';

    // Create an instance of our predicate.
    is_odd&lt;int&gt; odd;

    // Use not1 on our user defined predicate.
    std::cout &lt;&lt; odd (1) &lt;&lt; '\n'
              &lt;&lt; odd (4) &lt;&lt; '\n'
              &lt;&lt; std::not1 (odd)(1) &lt;&lt; '\n'
              &lt;&lt; std::not1 (odd)(4) &lt;&lt; std::endl;

    return 0;
}


Program Output:
</PRE></UL>
<UL><PRE>true
false
false
true
true
false
false
true
</PRE></UL>
<A NAME="sec7"><H3>See Also</H3></A>
<P><A HREF="algorithms.html">Algorithms</A>, <B><I><A HREF="binary-function.html">binary_function</A></I></B>, <A HREF="functionobjects.html">Function Objects</A>, <B><I><A HREF="unary-function.html">unary_function</A></I></B></P>
<A NAME="sec8"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 20.3.5</I></P>

<BR>
<HR>
<A HREF="negate.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="new-h.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>
