operators.html 99 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Operator Type Traits</title>
  5. <link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
  8. <link rel="up" href="../value_traits.html" title="Type Traits that Describe the Properties of a Type">
  9. <link rel="prev" href="relate.html" title="Relationships Between Two Types">
  10. <link rel="next" href="../transform.html" title="Type Traits that Transform One Type to Another">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="relate.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../value_traits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../transform.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h4 class="title">
  27. <a name="boost_typetraits.category.value_traits.operators"></a><a class="link" href="operators.html" title="Operator Type Traits">Operator
  28. Type Traits</a>
  29. </h4></div></div></div>
  30. <h6>
  31. <a name="boost_typetraits.category.value_traits.operators.h0"></a>
  32. <span class="phrase"><a name="boost_typetraits.category.value_traits.operators.introduction"></a></span><a class="link" href="operators.html#boost_typetraits.category.value_traits.operators.introduction">Introduction</a>
  33. </h6>
  34. <p>
  35. These traits are all <span class="emphasis"><em>value traits</em></span> inheriting from
  36. <a class="link" href="../../reference/integral_constant.html" title="integral_constant">integral_constant</a>
  37. and providing a simple <code class="computeroutput"><span class="keyword">true</span></code>
  38. or <code class="computeroutput"><span class="keyword">false</span></code> boolean <code class="computeroutput"><span class="identifier">value</span></code> which reflects the fact that given
  39. types can or cannot be used with given operators.
  40. </p>
  41. <p>
  42. For example, <code class="computeroutput"><span class="identifier">has_plus</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
  43. is a <code class="computeroutput"><span class="keyword">bool</span></code> which value is
  44. <code class="computeroutput"><span class="keyword">true</span></code> because it is possible
  45. to add a <code class="computeroutput"><span class="keyword">double</span></code> to an <code class="computeroutput"><span class="keyword">int</span></code> like in the following code:
  46. </p>
  47. <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span>
  48. <span class="keyword">double</span> <span class="identifier">d</span><span class="special">;</span>
  49. <span class="identifier">i</span><span class="special">+</span><span class="identifier">d</span><span class="special">;</span>
  50. </pre>
  51. <p>
  52. It is also possible to know if the result of the operator can be used as
  53. function argument of a given type. For example, <code class="computeroutput"><span class="identifier">has_plus</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">,</span> <span class="keyword">float</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
  54. is <code class="computeroutput"><span class="keyword">true</span></code> because it is possible
  55. to add a <code class="computeroutput"><span class="keyword">double</span></code> to an <code class="computeroutput"><span class="keyword">int</span></code> and the result (<code class="computeroutput"><span class="keyword">double</span></code>)
  56. can be converted to a <code class="computeroutput"><span class="keyword">float</span></code>
  57. argument like in the following code:
  58. </p>
  59. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">float</span><span class="special">)</span> <span class="special">{</span> <span class="special">};</span>
  60. <span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span>
  61. <span class="keyword">double</span> <span class="identifier">d</span><span class="special">;</span>
  62. <span class="identifier">f</span><span class="special">(</span><span class="identifier">i</span><span class="special">+</span><span class="identifier">d</span><span class="special">);</span>
  63. </pre>
  64. <p>
  65. </p>
  66. <h6>
  67. <a name="boost_typetraits.category.value_traits.operators.h1"></a>
  68. <span class="phrase"><a name="boost_typetraits.category.value_traits.operators.example_of_application"></a></span><a class="link" href="operators.html#boost_typetraits.category.value_traits.operators.example_of_application">Example
  69. of application</a>
  70. </h6>
  71. <p>
  72. These traits can be useful to optimize the code for types supporting given
  73. operations. For example a function <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">advance</span></code>
  74. that increases an iterator of a given number of steps could be implemented
  75. as follows:
  76. </p>
  77. <p>
  78. </p>
  79. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_plus_assign</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  80. <span class="keyword">namespace</span> <span class="identifier">detail</span> <span class="special">{</span>
  81. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Distance</span><span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">has_plus_assign</span> <span class="special">&gt;</span>
  82. <span class="keyword">struct</span> <span class="identifier">advance_impl</span><span class="special">;</span>
  83. <span class="comment">// this is used if += exists (efficient)</span>
  84. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Distance</span> <span class="special">&gt;</span>
  85. <span class="keyword">struct</span> <span class="identifier">advance_impl</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">Distance</span><span class="special">,</span> <span class="keyword">true</span><span class="special">&gt;</span> <span class="special">{</span>
  86. <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Iterator</span> <span class="special">&amp;</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">Distance</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">{</span>
  87. <span class="identifier">i</span><span class="special">+=</span><span class="identifier">n</span><span class="special">;</span>
  88. <span class="special">}</span>
  89. <span class="special">};</span>
  90. <span class="comment">// this is use if += does not exists (less efficient but cannot do better)</span>
  91. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Distance</span> <span class="special">&gt;</span>
  92. <span class="keyword">struct</span> <span class="identifier">advance_impl</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">Distance</span><span class="special">,</span> <span class="keyword">false</span><span class="special">&gt;</span> <span class="special">{</span>
  93. <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Iterator</span> <span class="special">&amp;</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">Distance</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">{</span>
  94. <span class="keyword">if</span> <span class="special">(</span><span class="identifier">n</span><span class="special">&gt;</span><span class="number">0</span><span class="special">)</span> <span class="special">{</span>
  95. <span class="keyword">while</span> <span class="special">(</span><span class="identifier">n</span><span class="special">--)</span> <span class="special">++</span><span class="identifier">i</span><span class="special">;</span>
  96. <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
  97. <span class="keyword">while</span> <span class="special">(</span><span class="identifier">n</span><span class="special">++)</span> <span class="special">--</span><span class="identifier">i</span><span class="special">;</span>
  98. <span class="special">}</span>
  99. <span class="special">}</span>
  100. <span class="special">};</span>
  101. <span class="special">}</span> <span class="comment">// namespace detail</span>
  102. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Distance</span> <span class="special">&gt;</span>
  103. <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">advance</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="special">&amp;</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">Distance</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">{</span>
  104. <span class="identifier">detail</span><span class="special">::</span><span class="identifier">advance_impl</span><span class="special">&lt;</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">Distance</span><span class="special">,</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_plus_assign</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">value</span> <span class="special">&gt;()(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">n</span><span class="special">);</span>
  105. <span class="special">}</span>
  106. </pre>
  107. <p>
  108. </p>
  109. <p>
  110. Then the compiler chooses the most efficient implementation according to
  111. the type's ability to perform <code class="computeroutput"><span class="special">+=</span></code>
  112. operation:
  113. </p>
  114. <p>
  115. </p>
  116. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
  117. <span class="keyword">class</span> <span class="identifier">with</span> <span class="special">{</span>
  118. <span class="keyword">int</span> <span class="identifier">m_i</span><span class="special">;</span>
  119. <span class="keyword">public</span><span class="special">:</span>
  120. <span class="identifier">with</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">=</span><span class="number">0</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">m_i</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> <span class="special">}</span>
  121. <span class="identifier">with</span> <span class="special">&amp;</span><span class="keyword">operator</span><span class="special">+=(</span><span class="keyword">int</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">m_i</span><span class="special">+=</span><span class="identifier">rhs</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> <span class="special">}</span>
  122. <span class="keyword">operator</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">m_i</span><span class="special">;</span> <span class="special">}</span>
  123. <span class="special">};</span>
  124. <span class="keyword">class</span> <span class="identifier">without</span> <span class="special">{</span>
  125. <span class="keyword">int</span> <span class="identifier">m_i</span><span class="special">;</span>
  126. <span class="keyword">public</span><span class="special">:</span>
  127. <span class="identifier">without</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">=</span><span class="number">0</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">m_i</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> <span class="special">}</span>
  128. <span class="identifier">without</span> <span class="special">&amp;</span><span class="keyword">operator</span><span class="special">++()</span> <span class="special">{</span> <span class="special">++</span><span class="identifier">m_i</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> <span class="special">}</span>
  129. <span class="identifier">without</span> <span class="special">&amp;</span><span class="keyword">operator</span><span class="special">--()</span> <span class="special">{</span> <span class="special">--</span><span class="identifier">m_i</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> <span class="special">}</span>
  130. <span class="keyword">operator</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">m_i</span><span class="special">;</span> <span class="special">}</span>
  131. <span class="special">};</span>
  132. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  133. <span class="identifier">with</span> <span class="identifier">i</span><span class="special">=</span><span class="number">0</span><span class="special">;</span>
  134. <span class="identifier">advance</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="number">10</span><span class="special">);</span> <span class="comment">// uses +=</span>
  135. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="string">"with: "</span><span class="special">&lt;&lt;</span><span class="identifier">i</span><span class="special">&lt;&lt;</span><span class="char">'\n'</span><span class="special">;</span>
  136. <span class="identifier">without</span> <span class="identifier">j</span><span class="special">=</span><span class="number">0</span><span class="special">;</span>
  137. <span class="identifier">advance</span><span class="special">(</span><span class="identifier">j</span><span class="special">,</span> <span class="number">10</span><span class="special">);</span> <span class="comment">// uses ++</span>
  138. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="string">"without: "</span><span class="special">&lt;&lt;</span><span class="identifier">j</span><span class="special">&lt;&lt;</span><span class="char">'\n'</span><span class="special">;</span>
  139. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  140. <span class="special">}</span>
  141. </pre>
  142. <p>
  143. </p>
  144. <h6>
  145. <a name="boost_typetraits.category.value_traits.operators.h2"></a>
  146. <span class="phrase"><a name="boost_typetraits.category.value_traits.operators.description"></a></span><a class="link" href="operators.html#boost_typetraits.category.value_traits.operators.description">Description</a>
  147. </h6>
  148. <p>
  149. The syntax is the following:
  150. </p>
  151. <pre class="programlisting"><span class="keyword">template</span> <code class="computeroutput"><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Ret</span><span class="special">=</span><span class="identifier">dont_care</span> <span class="special">&gt;</span></code> <span class="identifier">has_op</span><span class="special">;</span> <span class="comment">// prefix operator</span>
  152. <span class="keyword">template</span> <code class="computeroutput"><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Ret</span><span class="special">=</span><span class="identifier">dont_care</span> <span class="special">&gt;</span></code> <span class="identifier">has_op</span><span class="special">;</span> <span class="comment">// postfix operator</span>
  153. <span class="keyword">template</span> <code class="computeroutput"><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rhs</span><span class="special">=</span><span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Ret</span><span class="special">=</span><span class="identifier">dont_care</span> <span class="special">&gt;</span></code> <span class="identifier">has_op</span><span class="special">;</span> <span class="comment">// binary operator</span>
  154. </pre>
  155. <p>
  156. where:
  157. </p>
  158. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  159. <li class="listitem">
  160. op represents the operator name
  161. </li>
  162. <li class="listitem">
  163. <code class="computeroutput"><span class="identifier">Lhs</span></code> is the type used
  164. at the left hand side of <code class="computeroutput"><span class="keyword">operator</span>
  165. <span class="identifier">op</span></code>,
  166. </li>
  167. <li class="listitem">
  168. <code class="computeroutput"><span class="identifier">Rhs</span></code> is the type used
  169. at the right hand side of <code class="computeroutput"><span class="keyword">operator</span>
  170. <span class="identifier">op</span></code>,
  171. </li>
  172. <li class="listitem">
  173. <code class="computeroutput"><span class="identifier">Ret</span></code> is the type for
  174. which we want to know if the result of <code class="computeroutput"><span class="keyword">operator</span>
  175. <span class="identifier">op</span></code> can be converted to.
  176. </li>
  177. </ul></div>
  178. <p>
  179. The default behaviour (<code class="computeroutput"><span class="identifier">Ret</span><span class="special">=</span><span class="identifier">dont_care</span></code>)
  180. is to not check for the return value of the operator. If <code class="computeroutput"><span class="identifier">Ret</span></code> is different from the default <code class="computeroutput"><span class="identifier">dont_care</span></code>, the return value is checked
  181. to be convertible to <code class="computeroutput"><span class="identifier">Ret</span></code>.
  182. Convertible to <code class="computeroutput"><span class="identifier">Ret</span></code> means
  183. that the return value can be used as argument to a function expecting
  184. <code class="computeroutput"><span class="identifier">Ret</span></code>:
  185. </p>
  186. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">Ret</span><span class="special">);</span>
  187. <span class="identifier">Lhs</span> <span class="identifier">lhs</span><span class="special">;</span>
  188. <span class="identifier">Rhs</span> <span class="identifier">rhs</span><span class="special">;</span>
  189. <span class="identifier">f</span><span class="special">(</span><span class="identifier">lhs</span><span class="special">+</span><span class="identifier">rhs</span><span class="special">);</span> <span class="comment">// is valid if has_plus&lt;Lhs, Rhs, Ret&gt;::value==true</span>
  190. </pre>
  191. <p>
  192. If <code class="computeroutput"><span class="identifier">Ret</span><span class="special">=</span><span class="keyword">void</span></code>, the return type is checked to be exactly
  193. <code class="computeroutput"><span class="keyword">void</span></code>.
  194. </p>
  195. <p>
  196. The following tables give the list of supported binary, prefix and postfix
  197. operators.
  198. </p>
  199. <div class="table">
  200. <a name="boost_typetraits.category.value_traits.operators.supported_prefix_operators"></a><p class="title"><b>Table&#160;1.4.&#160;Supported prefix operators</b></p>
  201. <div class="table-contents"><table class="table" summary="Supported prefix operators">
  202. <colgroup>
  203. <col>
  204. <col>
  205. </colgroup>
  206. <thead><tr>
  207. <th>
  208. <p>
  209. prefix operator
  210. </p>
  211. </th>
  212. <th>
  213. <p>
  214. trait name
  215. </p>
  216. </th>
  217. </tr></thead>
  218. <tbody>
  219. <tr>
  220. <td>
  221. <p>
  222. <code class="computeroutput"><span class="special">!</span></code>
  223. </p>
  224. </td>
  225. <td>
  226. <p>
  227. <a class="link" href="../../reference/has_logical_not.html" title="has_logical_not"><code class="computeroutput"><span class="identifier">has_logical_not</span></code></a> <code class="computeroutput"><span class="special">&lt;</span> <span class="keyword">class</span>
  228. <span class="identifier">Rhs</span><span class="special">,</span>
  229. <span class="keyword">class</span> <span class="identifier">Ret</span><span class="special">=</span><span class="identifier">dont_care</span>
  230. <span class="special">&gt;</span></code>
  231. </p>
  232. </td>
  233. </tr>
  234. <tr>
  235. <td>
  236. <p>
  237. <code class="computeroutput"><span class="special">+</span></code>
  238. </p>
  239. </td>
  240. <td>
  241. <p>
  242. <a class="link" href="../../reference/has_unary_plus.html" title="has_unary_plus"><code class="computeroutput"><span class="identifier">has_unary_plus</span></code></a>
  243. </p>
  244. </td>
  245. </tr>
  246. <tr>
  247. <td>
  248. <p>
  249. <code class="computeroutput"><span class="special">-</span></code>
  250. </p>
  251. </td>
  252. <td>
  253. <p>
  254. <a class="link" href="../../reference/has_unary_minus.html" title="has_unary_minus"><code class="computeroutput"><span class="identifier">has_unary_minus</span></code></a> and
  255. <a class="link" href="../../reference/has_negate.html" title="has_negate"><code class="computeroutput"><span class="identifier">has_negate</span></code></a>
  256. </p>
  257. </td>
  258. </tr>
  259. <tr>
  260. <td>
  261. <p>
  262. <code class="computeroutput"><span class="special">~</span></code>
  263. </p>
  264. </td>
  265. <td>
  266. <p>
  267. <a class="link" href="../../reference/has_complement.html" title="has_complement"><code class="computeroutput"><span class="identifier">has_complement</span></code></a>
  268. </p>
  269. </td>
  270. </tr>
  271. <tr>
  272. <td>
  273. <p>
  274. <code class="computeroutput"><span class="special">*</span></code>
  275. </p>
  276. </td>
  277. <td>
  278. <p>
  279. <a class="link" href="../../reference/has_dereference.html" title="has_dereference"><code class="computeroutput"><span class="identifier">has_dereference</span></code></a>
  280. </p>
  281. </td>
  282. </tr>
  283. <tr>
  284. <td>
  285. <p>
  286. <code class="computeroutput"><span class="special">++</span></code>
  287. </p>
  288. </td>
  289. <td>
  290. <p>
  291. <a class="link" href="../../reference/has_pre_increment.html" title="has_pre_increment"><code class="computeroutput"><span class="identifier">has_pre_increment</span></code></a>
  292. </p>
  293. </td>
  294. </tr>
  295. <tr>
  296. <td>
  297. <p>
  298. <code class="computeroutput"><span class="special">--</span></code>
  299. </p>
  300. </td>
  301. <td>
  302. <p>
  303. <a class="link" href="../../reference/has_pre_decrement.html" title="has_pre_decrement"><code class="computeroutput"><span class="identifier">has_pre_decrement</span></code></a>
  304. </p>
  305. </td>
  306. </tr>
  307. </tbody>
  308. </table></div>
  309. </div>
  310. <br class="table-break"><div class="table">
  311. <a name="boost_typetraits.category.value_traits.operators.supported_postfix_operators"></a><p class="title"><b>Table&#160;1.5.&#160;Supported postfix operators</b></p>
  312. <div class="table-contents"><table class="table" summary="Supported postfix operators">
  313. <colgroup>
  314. <col>
  315. <col>
  316. </colgroup>
  317. <thead><tr>
  318. <th>
  319. <p>
  320. postfix operator
  321. </p>
  322. </th>
  323. <th>
  324. <p>
  325. trait name
  326. </p>
  327. </th>
  328. </tr></thead>
  329. <tbody>
  330. <tr>
  331. <td>
  332. <p>
  333. <code class="computeroutput"><span class="special">++</span></code>
  334. </p>
  335. </td>
  336. <td>
  337. <p>
  338. <a class="link" href="../../reference/has_post_increment.html" title="has_post_increment"><code class="computeroutput"><span class="identifier">has_post_increment</span></code></a>
  339. <code class="computeroutput"><span class="special">&lt;</span> <span class="keyword">class</span>
  340. <span class="identifier">Lhs</span><span class="special">,</span>
  341. <span class="keyword">class</span> <span class="identifier">Ret</span><span class="special">=</span><span class="identifier">dont_care</span>
  342. <span class="special">&gt;</span></code>
  343. </p>
  344. </td>
  345. </tr>
  346. <tr>
  347. <td>
  348. <p>
  349. <code class="computeroutput"><span class="special">--</span></code>
  350. </p>
  351. </td>
  352. <td>
  353. <p>
  354. <a class="link" href="../../reference/has_post_decrement.html" title="has_post_decrement"><code class="computeroutput"><span class="identifier">has_post_decrement</span></code></a>
  355. </p>
  356. </td>
  357. </tr>
  358. </tbody>
  359. </table></div>
  360. </div>
  361. <br class="table-break"><div class="table">
  362. <a name="boost_typetraits.category.value_traits.operators.supported_binary_operators"></a><p class="title"><b>Table&#160;1.6.&#160;Supported binary operators</b></p>
  363. <div class="table-contents"><table class="table" summary="Supported binary operators">
  364. <colgroup>
  365. <col>
  366. <col>
  367. </colgroup>
  368. <thead><tr>
  369. <th>
  370. <p>
  371. binary operator
  372. </p>
  373. </th>
  374. <th>
  375. <p>
  376. trait name
  377. </p>
  378. </th>
  379. </tr></thead>
  380. <tbody>
  381. <tr>
  382. <td>
  383. <p>
  384. <code class="computeroutput"><span class="special">+</span></code>
  385. </p>
  386. </td>
  387. <td>
  388. <p>
  389. <a class="link" href="../../reference/has_plus.html" title="has_plus"><code class="computeroutput"><span class="identifier">has_plus</span></code></a> <code class="computeroutput"><span class="special">&lt;</span> <span class="keyword">class</span>
  390. <span class="identifier">Lhs</span><span class="special">,</span>
  391. <span class="keyword">class</span> <span class="identifier">Rhs</span><span class="special">=</span><span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">class</span>
  392. <span class="identifier">Ret</span><span class="special">=</span><span class="identifier">dont_care</span> <span class="special">&gt;</span></code>
  393. </p>
  394. </td>
  395. </tr>
  396. <tr>
  397. <td>
  398. <p>
  399. <code class="computeroutput"><span class="special">-</span></code>
  400. </p>
  401. </td>
  402. <td>
  403. <p>
  404. <a class="link" href="../../reference/has_minus.html" title="has_minus"><code class="computeroutput"><span class="identifier">has_minus</span></code></a>
  405. </p>
  406. </td>
  407. </tr>
  408. <tr>
  409. <td>
  410. <p>
  411. <code class="computeroutput"><span class="special">*</span></code>
  412. </p>
  413. </td>
  414. <td>
  415. <p>
  416. <a class="link" href="../../reference/has_multiplies.html" title="has_multiplies"><code class="computeroutput"><span class="identifier">has_multiplies</span></code></a>
  417. </p>
  418. </td>
  419. </tr>
  420. <tr>
  421. <td>
  422. <p>
  423. <code class="computeroutput"><span class="special">/</span></code>
  424. </p>
  425. </td>
  426. <td>
  427. <p>
  428. <a class="link" href="../../reference/has_divides.html" title="has_divides"><code class="computeroutput"><span class="identifier">has_divides</span></code></a>
  429. </p>
  430. </td>
  431. </tr>
  432. <tr>
  433. <td>
  434. <p>
  435. <code class="computeroutput"><span class="special">%</span></code>
  436. </p>
  437. </td>
  438. <td>
  439. <p>
  440. <a class="link" href="../../reference/has_modulus.html" title="has_modulus"><code class="computeroutput"><span class="identifier">has_modulus</span></code></a>
  441. </p>
  442. </td>
  443. </tr>
  444. <tr>
  445. <td>
  446. <p>
  447. <code class="computeroutput"><span class="special">+=</span></code>
  448. </p>
  449. </td>
  450. <td>
  451. <p>
  452. <a class="link" href="../../reference/has_plus_assign.html" title="has_plus_assign"><code class="computeroutput"><span class="identifier">has_plus_assign</span></code></a>
  453. </p>
  454. </td>
  455. </tr>
  456. <tr>
  457. <td>
  458. <p>
  459. <code class="computeroutput"><span class="special">-=</span></code>
  460. </p>
  461. </td>
  462. <td>
  463. <p>
  464. <a class="link" href="../../reference/has_minus_assign.html" title="has_minus_assign"><code class="computeroutput"><span class="identifier">has_minus_assign</span></code></a>
  465. </p>
  466. </td>
  467. </tr>
  468. <tr>
  469. <td>
  470. <p>
  471. <code class="computeroutput"><span class="special">*=</span></code>
  472. </p>
  473. </td>
  474. <td>
  475. <p>
  476. <a class="link" href="../../reference/has_multiplies_assign.html" title="has_multiplies_assign"><code class="computeroutput"><span class="identifier">has_multiplies_assign</span></code></a>
  477. </p>
  478. </td>
  479. </tr>
  480. <tr>
  481. <td>
  482. <p>
  483. <code class="computeroutput"><span class="special">/=</span></code>
  484. </p>
  485. </td>
  486. <td>
  487. <p>
  488. <a class="link" href="../../reference/has_divides_assign.html" title="has_divides_assign"><code class="computeroutput"><span class="identifier">has_divides_assign</span></code></a>
  489. </p>
  490. </td>
  491. </tr>
  492. <tr>
  493. <td>
  494. <p>
  495. <code class="computeroutput"><span class="special">%=</span></code>
  496. </p>
  497. </td>
  498. <td>
  499. <p>
  500. <a class="link" href="../../reference/has_modulus_assign.html" title="has_modulus_assign"><code class="computeroutput"><span class="identifier">has_modulus_assign</span></code></a>
  501. </p>
  502. </td>
  503. </tr>
  504. <tr>
  505. <td>
  506. <p>
  507. <code class="computeroutput"><span class="special">&amp;</span></code>
  508. </p>
  509. </td>
  510. <td>
  511. <p>
  512. <a class="link" href="../../reference/has_bit_and.html" title="has_bit_and"><code class="computeroutput"><span class="identifier">has_bit_and</span></code></a>
  513. </p>
  514. </td>
  515. </tr>
  516. <tr>
  517. <td>
  518. <p>
  519. <code class="computeroutput"><span class="special">|</span></code>
  520. </p>
  521. </td>
  522. <td>
  523. <p>
  524. <a class="link" href="../../reference/has_bit_or.html" title="has_bit_or"><code class="computeroutput"><span class="identifier">has_bit_or</span></code></a>
  525. </p>
  526. </td>
  527. </tr>
  528. <tr>
  529. <td>
  530. <p>
  531. <code class="computeroutput"><span class="special">^</span></code>
  532. </p>
  533. </td>
  534. <td>
  535. <p>
  536. <a class="link" href="../../reference/has_bit_xor.html" title="has_bit_xor"><code class="computeroutput"><span class="identifier">has_bit_xor</span></code></a>
  537. </p>
  538. </td>
  539. </tr>
  540. <tr>
  541. <td>
  542. <p>
  543. <code class="computeroutput"><span class="special">&amp;=</span></code>
  544. </p>
  545. </td>
  546. <td>
  547. <p>
  548. <a class="link" href="../../reference/has_bit_and_assign.html" title="has_bit_and_assign"><code class="computeroutput"><span class="identifier">has_bit_and_assign</span></code></a>
  549. </p>
  550. </td>
  551. </tr>
  552. <tr>
  553. <td>
  554. <p>
  555. <code class="computeroutput"><span class="special">|=</span></code>
  556. </p>
  557. </td>
  558. <td>
  559. <p>
  560. <a class="link" href="../../reference/has_bit_or_assign.html" title="has_bit_or_assign"><code class="computeroutput"><span class="identifier">has_bit_or_assign</span></code></a>
  561. </p>
  562. </td>
  563. </tr>
  564. <tr>
  565. <td>
  566. <p>
  567. <code class="computeroutput"><span class="special">^=</span></code>
  568. </p>
  569. </td>
  570. <td>
  571. <p>
  572. <a class="link" href="../../reference/has_bit_xor_assign.html" title="has_bit_xor_assign"><code class="computeroutput"><span class="identifier">has_bit_xor_assign</span></code></a>
  573. </p>
  574. </td>
  575. </tr>
  576. <tr>
  577. <td>
  578. <p>
  579. <code class="computeroutput"><span class="special">&lt;&lt;</span></code>
  580. </p>
  581. </td>
  582. <td>
  583. <p>
  584. <a class="link" href="../../reference/has_left_shift.html" title="has_left_shift"><code class="computeroutput"><span class="identifier">has_left_shift</span></code></a>
  585. </p>
  586. </td>
  587. </tr>
  588. <tr>
  589. <td>
  590. <p>
  591. <code class="computeroutput"><span class="special">&gt;&gt;</span></code>
  592. </p>
  593. </td>
  594. <td>
  595. <p>
  596. <a class="link" href="../../reference/has_right_shift.html" title="has_right_shift"><code class="computeroutput"><span class="identifier">has_right_shift</span></code></a>
  597. </p>
  598. </td>
  599. </tr>
  600. <tr>
  601. <td>
  602. <p>
  603. <code class="computeroutput"><span class="special">&lt;&lt;=</span></code>
  604. </p>
  605. </td>
  606. <td>
  607. <p>
  608. <a class="link" href="../../reference/has_left_shift_assign.html" title="has_left_shift_assign"><code class="computeroutput"><span class="identifier">has_left_shift_assign</span></code></a>
  609. </p>
  610. </td>
  611. </tr>
  612. <tr>
  613. <td>
  614. <p>
  615. <code class="computeroutput"><span class="special">&gt;&gt;=</span></code>
  616. </p>
  617. </td>
  618. <td>
  619. <p>
  620. <a class="link" href="../../reference/has_right_shift_assign.html" title="has_right_shift_assign"><code class="computeroutput"><span class="identifier">has_right_shift_assign</span></code></a>
  621. </p>
  622. </td>
  623. </tr>
  624. <tr>
  625. <td>
  626. <p>
  627. <code class="computeroutput"><span class="special">==</span></code>
  628. </p>
  629. </td>
  630. <td>
  631. <p>
  632. <a class="link" href="../../reference/has_equal_to.html" title="has_equal_to"><code class="computeroutput"><span class="identifier">has_equal_to</span></code></a>
  633. </p>
  634. </td>
  635. </tr>
  636. <tr>
  637. <td>
  638. <p>
  639. <code class="computeroutput"><span class="special">!=</span></code>
  640. </p>
  641. </td>
  642. <td>
  643. <p>
  644. <a class="link" href="../../reference/has_not_equal_to.html" title="has_not_equal_to"><code class="computeroutput"><span class="identifier">has_not_equal_to</span></code></a>
  645. </p>
  646. </td>
  647. </tr>
  648. <tr>
  649. <td>
  650. <p>
  651. <code class="computeroutput"><span class="special">&lt;</span></code>
  652. </p>
  653. </td>
  654. <td>
  655. <p>
  656. <a class="link" href="../../reference/has_less.html" title="has_less"><code class="computeroutput"><span class="identifier">has_less</span></code></a>
  657. </p>
  658. </td>
  659. </tr>
  660. <tr>
  661. <td>
  662. <p>
  663. <code class="computeroutput"><span class="special">&lt;=</span></code>
  664. </p>
  665. </td>
  666. <td>
  667. <p>
  668. <a class="link" href="../../reference/has_less_equal.html" title="has_less_equal"><code class="computeroutput"><span class="identifier">has_less_equal</span></code></a>
  669. </p>
  670. </td>
  671. </tr>
  672. <tr>
  673. <td>
  674. <p>
  675. <code class="computeroutput"><span class="special">&gt;</span></code>
  676. </p>
  677. </td>
  678. <td>
  679. <p>
  680. <a class="link" href="../../reference/has_greater.html" title="has_greater"><code class="computeroutput"><span class="identifier">has_greater</span></code></a>
  681. </p>
  682. </td>
  683. </tr>
  684. <tr>
  685. <td>
  686. <p>
  687. <code class="computeroutput"><span class="special">&gt;=</span></code>
  688. </p>
  689. </td>
  690. <td>
  691. <p>
  692. <a class="link" href="../../reference/has_greater_equal.html" title="has_greater_equal"><code class="computeroutput"><span class="identifier">has_greater_equal</span></code></a>
  693. </p>
  694. </td>
  695. </tr>
  696. <tr>
  697. <td>
  698. <p>
  699. <code class="computeroutput"><span class="special">&amp;&amp;</span></code>
  700. </p>
  701. </td>
  702. <td>
  703. <p>
  704. <a class="link" href="../../reference/has_logical_and.html" title="has_logical_and"><code class="computeroutput"><span class="identifier">has_logical_and</span></code></a>
  705. </p>
  706. </td>
  707. </tr>
  708. <tr>
  709. <td>
  710. <p>
  711. <code class="computeroutput"><span class="special">||</span></code>
  712. </p>
  713. </td>
  714. <td>
  715. <p>
  716. <a class="link" href="../../reference/has_logical_or.html" title="has_logical_or"><code class="computeroutput"><span class="identifier">has_logical_or</span></code></a>
  717. </p>
  718. </td>
  719. </tr>
  720. </tbody>
  721. </table></div>
  722. </div>
  723. <br class="table-break"><p>
  724. The following operators are not supported because they could not be implemented
  725. using the same technique: <code class="computeroutput"><span class="keyword">operator</span><span class="special">=</span></code>, <code class="computeroutput"><span class="keyword">operator</span><span class="special">-&gt;</span></code>, <code class="computeroutput"><span class="keyword">operator</span><span class="special">&amp;</span></code>, <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]</span></code>, <code class="computeroutput"><span class="keyword">operator</span><span class="special">,</span></code>, <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code>, <code class="computeroutput"><span class="keyword">operator</span>
  726. <span class="keyword">new</span></code>.
  727. </p>
  728. <h6>
  729. <a name="boost_typetraits.category.value_traits.operators.h3"></a>
  730. <span class="phrase"><a name="boost_typetraits.category.value_traits.operators.cv_qualifiers_and_references"></a></span><a class="link" href="operators.html#boost_typetraits.category.value_traits.operators.cv_qualifiers_and_references">cv
  731. qualifiers and references</a>
  732. </h6>
  733. <p>
  734. A reference sign <code class="computeroutput"><span class="special">&amp;</span></code> in
  735. the operator argument is ignored so that <code class="computeroutput"><span class="identifier">has_plus</span><span class="special">&lt;</span> <span class="keyword">int</span><span class="special">&amp;,</span> <span class="keyword">double</span><span class="special">&amp;</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">==</span><span class="identifier">has_plus</span><span class="special">&lt;</span>
  736. <span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span> <span class="special">&gt;::</span><span class="identifier">value</span></code>. This has been chosen because if
  737. the following code works (does not work):
  738. </p>
  739. <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span>
  740. <span class="keyword">double</span> <span class="identifier">d</span><span class="special">;</span>
  741. <span class="identifier">i</span><span class="special">+</span><span class="identifier">d</span><span class="special">;</span>
  742. </pre>
  743. <p>
  744. the following code also works (does not work):
  745. </p>
  746. <pre class="programlisting"><span class="keyword">int</span> <span class="special">&amp;</span><span class="identifier">ir</span><span class="special">=</span><span class="identifier">i</span><span class="special">;</span>
  747. <span class="keyword">double</span> <span class="special">&amp;</span><span class="identifier">dr</span><span class="special">=</span><span class="identifier">d</span><span class="special">;</span>
  748. <span class="identifier">ir</span><span class="special">+</span><span class="identifier">dr</span><span class="special">;</span>
  749. </pre>
  750. <p>
  751. </p>
  752. <p>
  753. It was not possible to handle properly the <code class="computeroutput"><span class="keyword">volatile</span></code>
  754. qualifier so that any construct using this qualifier has undefined behavior.
  755. </p>
  756. <p>
  757. As a help, the following tables give the necessary conditions over each
  758. trait template argument for the trait <code class="computeroutput"><span class="identifier">value</span></code>
  759. to be <code class="computeroutput"><span class="keyword">true</span></code>. They are non sufficient
  760. conditions because the conditions must be <code class="computeroutput"><span class="keyword">true</span></code>
  761. for all arguments and return type for <code class="computeroutput"><span class="identifier">value</span></code>
  762. to be <code class="computeroutput"><span class="keyword">true</span></code>.
  763. </p>
  764. <div class="table">
  765. <a name="boost_typetraits.category.value_traits.operators.necessary_and_non_sufficient_condition_on_operator_argument_for_value_to_be_true"></a><p class="title"><b>Table&#160;1.7.&#160;necessary and non sufficient condition on operator argument for
  766. value to be true</b></p>
  767. <div class="table-contents"><table class="table" summary="necessary and non sufficient condition on operator argument for
  768. value to be true">
  769. <colgroup>
  770. <col>
  771. <col>
  772. <col>
  773. <col>
  774. </colgroup>
  775. <thead><tr>
  776. <th>
  777. <p>
  778. operator declaration
  779. </p>
  780. </th>
  781. <th>
  782. <p>
  783. <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  784. <span class="keyword">void</span> <span class="special">&gt;</span></code>
  785. </p>
  786. </th>
  787. <th>
  788. <p>
  789. <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  790. <span class="identifier">Arg</span> <span class="special">&gt;</span></code>
  791. and <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  792. <span class="identifier">Arg</span><span class="special">&amp;</span>
  793. <span class="special">&gt;</span></code>
  794. </p>
  795. </th>
  796. <th>
  797. <p>
  798. <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  799. <span class="identifier">Arg</span> <span class="keyword">const</span>
  800. <span class="special">&gt;</span></code> and <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  801. <span class="identifier">Arg</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">&gt;</span></code>
  802. </p>
  803. </th>
  804. </tr></thead>
  805. <tbody>
  806. <tr>
  807. <td>
  808. <p>
  809. <code class="computeroutput"><span class="keyword">operator</span></code>@<code class="computeroutput"><span class="special">(</span><span class="identifier">Arg</span><span class="special">)</span></code>
  810. </p>
  811. </td>
  812. <td>
  813. <p>
  814. false
  815. </p>
  816. </td>
  817. <td>
  818. <p>
  819. true
  820. </p>
  821. </td>
  822. <td>
  823. <p>
  824. true
  825. </p>
  826. </td>
  827. </tr>
  828. <tr>
  829. <td>
  830. <p>
  831. <code class="computeroutput"><span class="keyword">operator</span></code>@<code class="computeroutput"><span class="special">(</span><span class="identifier">Arg</span>
  832. <span class="keyword">const</span><span class="special">)</span></code>
  833. </p>
  834. </td>
  835. <td>
  836. <p>
  837. false
  838. </p>
  839. </td>
  840. <td>
  841. <p>
  842. true
  843. </p>
  844. </td>
  845. <td>
  846. <p>
  847. true
  848. </p>
  849. </td>
  850. </tr>
  851. <tr>
  852. <td>
  853. <p>
  854. <code class="computeroutput"><span class="keyword">operator</span></code>@<code class="computeroutput"><span class="special">(</span><span class="identifier">Arg</span>
  855. <span class="special">&amp;)</span></code>
  856. </p>
  857. </td>
  858. <td>
  859. <p>
  860. false
  861. </p>
  862. </td>
  863. <td>
  864. <p>
  865. true
  866. </p>
  867. </td>
  868. <td>
  869. <p>
  870. false
  871. </p>
  872. </td>
  873. </tr>
  874. <tr>
  875. <td>
  876. <p>
  877. <code class="computeroutput"><span class="keyword">operator</span></code>@<code class="computeroutput"><span class="special">(</span><span class="identifier">Arg</span>
  878. <span class="keyword">const</span> <span class="special">&amp;)</span></code>
  879. </p>
  880. </td>
  881. <td>
  882. <p>
  883. false
  884. </p>
  885. </td>
  886. <td>
  887. <p>
  888. true
  889. </p>
  890. </td>
  891. <td>
  892. <p>
  893. true
  894. </p>
  895. </td>
  896. </tr>
  897. </tbody>
  898. </table></div>
  899. </div>
  900. <br class="table-break"><div class="table">
  901. <a name="boost_typetraits.category.value_traits.operators.necessary_and_non_sufficient_condition_on_operator_return_type_for_value_to_be_true"></a><p class="title"><b>Table&#160;1.8.&#160;necessary and non sufficient condition on operator return type for
  902. value to be true</b></p>
  903. <div class="table-contents"><table class="table" summary="necessary and non sufficient condition on operator return type for
  904. value to be true">
  905. <colgroup>
  906. <col>
  907. <col>
  908. <col>
  909. <col>
  910. <col>
  911. <col>
  912. </colgroup>
  913. <thead><tr>
  914. <th>
  915. <p>
  916. operator declaration
  917. </p>
  918. </th>
  919. <th>
  920. <p>
  921. <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  922. <span class="special">...,</span> <span class="keyword">void</span>
  923. <span class="special">&gt;</span></code>
  924. </p>
  925. </th>
  926. <th>
  927. <p>
  928. <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  929. <span class="special">...,</span> <span class="identifier">Ret</span>
  930. <span class="special">&gt;</span></code>
  931. </p>
  932. </th>
  933. <th>
  934. <p>
  935. <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  936. <span class="special">...,</span> <span class="identifier">Ret</span>
  937. <span class="keyword">const</span> <span class="special">&gt;</span></code>
  938. </p>
  939. </th>
  940. <th>
  941. <p>
  942. <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  943. <span class="special">...,</span> <span class="identifier">Ret</span>
  944. <span class="special">&amp;</span> <span class="special">&gt;</span></code>
  945. </p>
  946. </th>
  947. <th>
  948. <p>
  949. <code class="computeroutput"><span class="identifier">has_op</span><span class="special">&lt;</span>
  950. <span class="special">...,</span> <span class="identifier">Ret</span>
  951. <span class="keyword">const</span> <span class="special">&amp;</span>
  952. <span class="special">&gt;</span></code>
  953. </p>
  954. </th>
  955. </tr></thead>
  956. <tbody>
  957. <tr>
  958. <td>
  959. <p>
  960. <code class="computeroutput"><span class="keyword">void</span> <span class="keyword">operator</span></code>@<code class="computeroutput"><span class="special">(...)</span></code>
  961. </p>
  962. </td>
  963. <td>
  964. <p>
  965. true
  966. </p>
  967. </td>
  968. <td>
  969. <p>
  970. false
  971. </p>
  972. </td>
  973. <td>
  974. <p>
  975. false
  976. </p>
  977. </td>
  978. <td>
  979. <p>
  980. false
  981. </p>
  982. </td>
  983. <td>
  984. <p>
  985. false
  986. </p>
  987. </td>
  988. </tr>
  989. <tr>
  990. <td>
  991. <p>
  992. <code class="computeroutput"><span class="identifier">Ret</span> <span class="keyword">operator</span></code>@<code class="computeroutput"><span class="special">(...)</span></code>
  993. </p>
  994. </td>
  995. <td>
  996. <p>
  997. false
  998. </p>
  999. </td>
  1000. <td>
  1001. <p>
  1002. true
  1003. </p>
  1004. </td>
  1005. <td>
  1006. <p>
  1007. true
  1008. </p>
  1009. </td>
  1010. <td>
  1011. <p>
  1012. false
  1013. </p>
  1014. </td>
  1015. <td>
  1016. <p>
  1017. true
  1018. </p>
  1019. </td>
  1020. </tr>
  1021. <tr>
  1022. <td>
  1023. <p>
  1024. <code class="computeroutput"><span class="identifier">Ret</span> <span class="keyword">const</span>
  1025. <span class="keyword">operator</span></code>@<code class="computeroutput"><span class="special">(...)</span></code>
  1026. </p>
  1027. </td>
  1028. <td>
  1029. <p>
  1030. false
  1031. </p>
  1032. </td>
  1033. <td>
  1034. <p>
  1035. true
  1036. </p>
  1037. </td>
  1038. <td>
  1039. <p>
  1040. true
  1041. </p>
  1042. </td>
  1043. <td>
  1044. <p>
  1045. false
  1046. </p>
  1047. </td>
  1048. <td>
  1049. <p>
  1050. true
  1051. </p>
  1052. </td>
  1053. </tr>
  1054. <tr>
  1055. <td>
  1056. <p>
  1057. <code class="computeroutput"><span class="identifier">Ret</span> <span class="special">&amp;</span>
  1058. <span class="keyword">operator</span></code>@<code class="computeroutput"><span class="special">(...)</span></code>
  1059. </p>
  1060. </td>
  1061. <td>
  1062. <p>
  1063. false
  1064. </p>
  1065. </td>
  1066. <td>
  1067. <p>
  1068. true
  1069. </p>
  1070. </td>
  1071. <td>
  1072. <p>
  1073. true
  1074. </p>
  1075. </td>
  1076. <td>
  1077. <p>
  1078. true
  1079. </p>
  1080. </td>
  1081. <td>
  1082. <p>
  1083. true
  1084. </p>
  1085. </td>
  1086. </tr>
  1087. <tr>
  1088. <td>
  1089. <p>
  1090. <code class="computeroutput"><span class="identifier">Ret</span> <span class="keyword">const</span>
  1091. <span class="special">&amp;</span> <span class="keyword">operator</span></code>@<code class="computeroutput"><span class="special">(...)</span></code>
  1092. </p>
  1093. </td>
  1094. <td>
  1095. <p>
  1096. false
  1097. </p>
  1098. </td>
  1099. <td>
  1100. <p>
  1101. true
  1102. </p>
  1103. </td>
  1104. <td>
  1105. <p>
  1106. true
  1107. </p>
  1108. </td>
  1109. <td>
  1110. <p>
  1111. false
  1112. </p>
  1113. </td>
  1114. <td>
  1115. <p>
  1116. true
  1117. </p>
  1118. </td>
  1119. </tr>
  1120. </tbody>
  1121. </table></div>
  1122. </div>
  1123. <br class="table-break"><h6>
  1124. <a name="boost_typetraits.category.value_traits.operators.h4"></a>
  1125. <span class="phrase"><a name="boost_typetraits.category.value_traits.operators.implementation"></a></span><a class="link" href="operators.html#boost_typetraits.category.value_traits.operators.implementation">Implementation</a>
  1126. </h6>
  1127. <p>
  1128. The implementation consists in only header files. The following headers
  1129. should included first:
  1130. </p>
  1131. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_operator</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></pre>
  1132. <p>
  1133. or
  1134. </p>
  1135. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_op</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></pre>
  1136. <p>
  1137. where <code class="literal">op</code> is the textual name chosen for the wanted operator.
  1138. The first method includes all operator traits.
  1139. </p>
  1140. <p>
  1141. All traits are implemented the same way using preprocessor macros to avoid
  1142. code duplication. The main files are in <code class="literal">boost/type_traits/detail</code>:
  1143. <code class="literal">has_binary_operator.hpp</code>, <code class="literal">has_prefix_operator.hpp</code>
  1144. and <code class="literal">has_postfix_operator.hpp</code>. The example of prefix
  1145. <code class="computeroutput"><span class="keyword">operator</span><span class="special">-</span></code>
  1146. is presented below:
  1147. </p>
  1148. <p>
  1149. </p>
  1150. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
  1151. <span class="keyword">namespace</span> <span class="identifier">detail</span> <span class="special">{</span>
  1152. <span class="comment">// This namespace ensures that argument-dependent name lookup does not mess things up.</span>
  1153. <span class="keyword">namespace</span> <span class="identifier">has_unary_minus_impl</span> <span class="special">{</span>
  1154. <span class="comment">// 1. a function to have an instance of type T without requiring T to be default</span>
  1155. <span class="comment">// constructible</span>
  1156. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="special">&amp;</span><span class="identifier">make</span><span class="special">();</span>
  1157. <span class="comment">// 2. we provide our operator definition for types that do not have one already</span>
  1158. <span class="comment">// a type returned from operator- when no such operator is</span>
  1159. <span class="comment">// found in the type's own namespace (our own operator is used) so that we have</span>
  1160. <span class="comment">// a means to know that our operator was used</span>
  1161. <span class="keyword">struct</span> <span class="identifier">no_operator</span> <span class="special">{</span> <span class="special">};</span>
  1162. <span class="comment">// this class allows implicit conversions and makes the following operator</span>
  1163. <span class="comment">// definition less-preferred than any other such operators that might be found</span>
  1164. <span class="comment">// via argument-dependent name lookup</span>
  1165. <span class="keyword">struct</span> <span class="identifier">any</span> <span class="special">{</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">any</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;);</span> <span class="special">};</span>
  1166. <span class="comment">// when operator- is not available, this one is used</span>
  1167. <span class="identifier">no_operator</span> <span class="keyword">operator</span><span class="special">-(</span><span class="keyword">const</span> <span class="identifier">any</span><span class="special">&amp;);</span>
  1168. <span class="comment">// 3. checks if the operator returns void or not</span>
  1169. <span class="comment">// conditions: Rhs!=void</span>
  1170. <span class="comment">// we first redefine "operator," so that we have no compilation error if</span>
  1171. <span class="comment">// operator- returns void and we can use the return type of</span>
  1172. <span class="comment">// (-rhs, returns_void_t()) to deduce if operator- returns void or not:</span>
  1173. <span class="comment">// - operator- returns void -&gt; (-rhs, returns_void_t()) returns returns_void_t</span>
  1174. <span class="comment">// - operator- returns !=void -&gt; (-rhs, returns_void_t()) returns int</span>
  1175. <span class="keyword">struct</span> <span class="identifier">returns_void_t</span> <span class="special">{</span> <span class="special">};</span>
  1176. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">,(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;,</span> <span class="identifier">returns_void_t</span><span class="special">);</span>
  1177. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">,(</span><span class="keyword">const</span> <span class="keyword">volatile</span> <span class="identifier">T</span><span class="special">&amp;,</span> <span class="identifier">returns_void_t</span><span class="special">);</span>
  1178. <span class="comment">// this intermediate trait has member value of type bool:</span>
  1179. <span class="comment">// - value==true -&gt; operator- returns void</span>
  1180. <span class="comment">// - value==false -&gt; operator- does not return void</span>
  1181. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span> <span class="special">&gt;</span>
  1182. <span class="keyword">struct</span> <span class="identifier">operator_returns_void</span> <span class="special">{</span>
  1183. <span class="comment">// overloads of function returns_void make the difference</span>
  1184. <span class="comment">// yes_type and no_type have different size by construction</span>
  1185. <span class="keyword">static</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">yes_type</span> <span class="identifier">returns_void</span><span class="special">(</span><span class="identifier">returns_void_t</span><span class="special">);</span>
  1186. <span class="keyword">static</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">no_type</span> <span class="identifier">returns_void</span><span class="special">(</span><span class="keyword">int</span><span class="special">);</span>
  1187. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">sizeof</span><span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">yes_type</span><span class="special">)==</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">returns_void</span><span class="special">((-</span><span class="identifier">make</span><span class="special">&lt;</span><span class="identifier">Rhs</span><span class="special">&gt;(),</span><span class="identifier">returns_void_t</span><span class="special">())));</span>
  1188. <span class="special">};</span>
  1189. <span class="comment">// 4. checks if the return type is Ret or Ret==dont_care</span>
  1190. <span class="comment">// conditions: Rhs!=void</span>
  1191. <span class="keyword">struct</span> <span class="identifier">dont_care</span> <span class="special">{</span> <span class="special">};</span>
  1192. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Ret</span><span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">Returns_void</span> <span class="special">&gt;</span>
  1193. <span class="keyword">struct</span> <span class="identifier">operator_returns_Ret</span><span class="special">;</span>
  1194. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span> <span class="special">&gt;</span>
  1195. <span class="keyword">struct</span> <span class="identifier">operator_returns_Ret</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">dont_care</span><span class="special">,</span> <span class="keyword">true</span> <span class="special">&gt;</span> <span class="special">{</span>
  1196. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
  1197. <span class="special">};</span>
  1198. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span> <span class="special">&gt;</span>
  1199. <span class="keyword">struct</span> <span class="identifier">operator_returns_Ret</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">dont_care</span><span class="special">,</span> <span class="keyword">false</span> <span class="special">&gt;</span> <span class="special">{</span>
  1200. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
  1201. <span class="special">};</span>
  1202. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span> <span class="special">&gt;</span>
  1203. <span class="keyword">struct</span> <span class="identifier">operator_returns_Ret</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">void</span><span class="special">,</span> <span class="keyword">true</span> <span class="special">&gt;</span> <span class="special">{</span>
  1204. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
  1205. <span class="special">};</span>
  1206. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span> <span class="special">&gt;</span>
  1207. <span class="keyword">struct</span> <span class="identifier">operator_returns_Ret</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">void</span><span class="special">,</span> <span class="keyword">false</span> <span class="special">&gt;</span> <span class="special">{</span>
  1208. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
  1209. <span class="special">};</span>
  1210. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Ret</span> <span class="special">&gt;</span>
  1211. <span class="keyword">struct</span> <span class="identifier">operator_returns_Ret</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">Ret</span><span class="special">,</span> <span class="keyword">true</span> <span class="special">&gt;</span> <span class="special">{</span>
  1212. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
  1213. <span class="special">};</span>
  1214. <span class="comment">// otherwise checks if it is convertible to Ret using the sizeof trick</span>
  1215. <span class="comment">// based on overload resolution</span>
  1216. <span class="comment">// condition: Ret!=void and Ret!=dont_care and the operator does not return void</span>
  1217. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Ret</span> <span class="special">&gt;</span>
  1218. <span class="keyword">struct</span> <span class="identifier">operator_returns_Ret</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">Ret</span><span class="special">,</span> <span class="keyword">false</span> <span class="special">&gt;</span> <span class="special">{</span>
  1219. <span class="keyword">static</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">yes_type</span> <span class="identifier">is_convertible_to_Ret</span><span class="special">(</span><span class="identifier">Ret</span><span class="special">);</span> <span class="comment">// this version is preferred for types convertible to Ret</span>
  1220. <span class="keyword">static</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">no_type</span> <span class="identifier">is_convertible_to_Ret</span><span class="special">(...);</span> <span class="comment">// this version is used otherwise</span>
  1221. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">is_convertible_to_Ret</span><span class="special">(-</span><span class="identifier">make</span><span class="special">&lt;</span><span class="identifier">Rhs</span><span class="special">&gt;()))==</span><span class="keyword">sizeof</span><span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">yes_type</span><span class="special">);</span>
  1222. <span class="special">};</span>
  1223. <span class="comment">// 5. checks for operator existence</span>
  1224. <span class="comment">// condition: Rhs!=void</span>
  1225. <span class="comment">// checks if our definition of operator- is used or an other</span>
  1226. <span class="comment">// existing one;</span>
  1227. <span class="comment">// this is done with redefinition of "operator," that returns no_operator or has_operator</span>
  1228. <span class="keyword">struct</span> <span class="identifier">has_operator</span> <span class="special">{</span> <span class="special">};</span>
  1229. <span class="identifier">no_operator</span> <span class="keyword">operator</span><span class="special">,(</span><span class="identifier">no_operator</span><span class="special">,</span> <span class="identifier">has_operator</span><span class="special">);</span>
  1230. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span> <span class="special">&gt;</span>
  1231. <span class="keyword">struct</span> <span class="identifier">operator_exists</span> <span class="special">{</span>
  1232. <span class="keyword">static</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">yes_type</span> <span class="identifier">check</span><span class="special">(</span><span class="identifier">has_operator</span><span class="special">);</span> <span class="comment">// this version is preferred when operator exists</span>
  1233. <span class="keyword">static</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">no_type</span> <span class="identifier">check</span><span class="special">(</span><span class="identifier">no_operator</span><span class="special">);</span> <span class="comment">// this version is used otherwise</span>
  1234. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">check</span><span class="special">(((-</span><span class="identifier">make</span><span class="special">&lt;</span><span class="identifier">Rhs</span><span class="special">&gt;()),</span><span class="identifier">make</span><span class="special">&lt;</span><span class="identifier">has_operator</span><span class="special">&gt;())))==</span><span class="keyword">sizeof</span><span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">yes_type</span><span class="special">);</span>
  1235. <span class="special">};</span>
  1236. <span class="comment">// 6. main trait: to avoid any compilation error, this class behaves</span>
  1237. <span class="comment">// differently when operator-(Rhs) is forbidden by the standard.</span>
  1238. <span class="comment">// Forbidden_if is a bool that is:</span>
  1239. <span class="comment">// - true when the operator-(Rhs) is forbidden by the standard</span>
  1240. <span class="comment">// (would yield compilation error if used)</span>
  1241. <span class="comment">// - false otherwise</span>
  1242. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Ret</span><span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">Forbidden_if</span> <span class="special">&gt;</span>
  1243. <span class="keyword">struct</span> <span class="identifier">trait_impl1</span><span class="special">;</span>
  1244. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Ret</span> <span class="special">&gt;</span>
  1245. <span class="keyword">struct</span> <span class="identifier">trait_impl1</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">Ret</span><span class="special">,</span> <span class="keyword">true</span> <span class="special">&gt;</span> <span class="special">{</span>
  1246. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
  1247. <span class="special">};</span>
  1248. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Ret</span> <span class="special">&gt;</span>
  1249. <span class="keyword">struct</span> <span class="identifier">trait_impl1</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">Ret</span><span class="special">,</span> <span class="keyword">false</span> <span class="special">&gt;</span> <span class="special">{</span>
  1250. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span>
  1251. <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_traits</span><span class="special">::</span><span class="identifier">ice_and</span><span class="special">&lt;</span>
  1252. <span class="identifier">operator_exists</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">,</span>
  1253. <span class="identifier">operator_returns_Ret</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">Ret</span><span class="special">,</span> <span class="identifier">operator_returns_void</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span> <span class="special">&gt;::</span><span class="identifier">value</span> <span class="special">&gt;::</span><span class="identifier">value</span>
  1254. <span class="special">&gt;::</span><span class="identifier">value</span>
  1255. <span class="special">;</span>
  1256. <span class="special">};</span>
  1257. <span class="comment">// specialization needs to be declared for the special void case</span>
  1258. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Ret</span> <span class="special">&gt;</span>
  1259. <span class="keyword">struct</span> <span class="identifier">trait_impl1</span> <span class="special">&lt;</span> <span class="keyword">void</span><span class="special">,</span> <span class="identifier">Ret</span><span class="special">,</span> <span class="keyword">false</span> <span class="special">&gt;</span> <span class="special">{</span>
  1260. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
  1261. <span class="special">};</span>
  1262. <span class="comment">// defines some typedef for convenience</span>
  1263. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Ret</span> <span class="special">&gt;</span>
  1264. <span class="keyword">struct</span> <span class="identifier">trait_impl</span> <span class="special">{</span>
  1265. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="identifier">Rhs</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">Rhs_noref</span><span class="special">;</span>
  1266. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_cv</span><span class="special">&lt;</span><span class="identifier">Rhs_noref</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">Rhs_nocv</span><span class="special">;</span>
  1267. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_cv</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_pointer</span><span class="special">&lt;</span><span class="identifier">Rhs_noref</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">Rhs_noptr</span><span class="special">;</span>
  1268. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">trait_impl1</span> <span class="special">&lt;</span> <span class="identifier">Rhs_noref</span><span class="special">,</span> <span class="identifier">Ret</span><span class="special">,</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_pointer</span><span class="special">&lt;</span> <span class="identifier">Rhs_noref</span> <span class="special">&gt;::</span><span class="identifier">value</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span>
  1269. <span class="special">};</span>
  1270. <span class="special">}</span> <span class="comment">// namespace impl</span>
  1271. <span class="special">}</span> <span class="comment">// namespace detail</span>
  1272. <span class="comment">// this is the accessible definition of the trait to end user</span>
  1273. <span class="keyword">template</span> <span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Ret</span><span class="special">=::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">has_unary_minus_impl</span><span class="special">::</span><span class="identifier">dont_care</span> <span class="special">&gt;</span>
  1274. <span class="keyword">struct</span> <span class="identifier">has_unary_minus</span> <span class="special">:</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">integral_constant</span><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">,(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">has_unary_minus_impl</span><span class="special">::</span><span class="identifier">trait_impl</span> <span class="special">&lt;</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="identifier">Ret</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)&gt;</span> <span class="special">{</span> <span class="special">};</span>
  1275. <span class="special">}</span> <span class="comment">// namespace boost</span>
  1276. </pre>
  1277. <p>
  1278. </p>
  1279. <h6>
  1280. <a name="boost_typetraits.category.value_traits.operators.h5"></a>
  1281. <span class="phrase"><a name="boost_typetraits.category.value_traits.operators.limitation"></a></span><a class="link" href="operators.html#boost_typetraits.category.value_traits.operators.limitation">Limitation</a>
  1282. </h6>
  1283. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
  1284. Requires a compiler with working SFINAE.
  1285. </li></ul></div>
  1286. <h6>
  1287. <a name="boost_typetraits.category.value_traits.operators.h6"></a>
  1288. <span class="phrase"><a name="boost_typetraits.category.value_traits.operators.known_issues"></a></span><a class="link" href="operators.html#boost_typetraits.category.value_traits.operators.known_issues">Known
  1289. issues</a>
  1290. </h6>
  1291. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  1292. <li class="listitem">
  1293. These traits cannot detect whether the operators are public or not:
  1294. if an operator is defined as a private member of type <code class="computeroutput"><span class="identifier">T</span></code> then the instantiation of the corresponding
  1295. trait will produce a compiler error. For this reason these traits cannot
  1296. be used to determine whether a type has a public operator or not.
  1297. <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">A</span> <span class="special">{</span> <span class="keyword">private</span><span class="special">:</span> <span class="identifier">A</span> <span class="keyword">operator</span><span class="special">-();</span> <span class="special">};</span>
  1298. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_unary_minus</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// error: A::operator-() is private</span>
  1299. </pre>
  1300. </li>
  1301. <li class="listitem">
  1302. There is an issue if the operator exists only for type <code class="computeroutput"><span class="identifier">A</span></code> and <code class="computeroutput"><span class="identifier">B</span></code>
  1303. is convertible to <code class="computeroutput"><span class="identifier">A</span></code>.
  1304. In this case, the compiler will report an ambiguous overload because
  1305. both the existing operator and the one we provide (with argument of
  1306. type <code class="computeroutput"><span class="identifier">any</span></code>) need type
  1307. conversion, so that none is preferred.
  1308. <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">A</span> <span class="special">{</span> <span class="special">};</span>
  1309. <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">-(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&amp;);</span>
  1310. <span class="keyword">struct</span> <span class="identifier">B</span> <span class="special">{</span> <span class="keyword">operator</span> <span class="identifier">A</span><span class="special">();</span> <span class="special">};</span>
  1311. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_unary_minus</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// this is fine</span>
  1312. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_unary_minus</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// error: ambiguous overload between</span>
  1313. <span class="comment">// operator-(const any&amp;) and</span>
  1314. <span class="comment">// operator-(const A&amp;)</span>
  1315. <span class="comment">// both need type conversion</span>
  1316. </pre>
  1317. <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">B</span> <span class="special">{</span> <span class="special">};</span>
  1318. <span class="keyword">struct</span> <span class="identifier">A</span> <span class="special">{</span> <span class="identifier">A</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&amp;)</span> <span class="special">{</span> <span class="special">}</span> <span class="special">};</span>
  1319. <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">-(</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&amp;);</span>
  1320. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_unary_minus</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// this is fine</span>
  1321. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_unary_minus</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// error: ambiguous overload between</span>
  1322. <span class="comment">// operator-(const any&amp;) and</span>
  1323. <span class="comment">// operator-(const A&amp;)</span>
  1324. <span class="comment">// both need type conversion</span>
  1325. </pre>
  1326. </li>
  1327. <li class="listitem">
  1328. There is an issue when applying these traits to template classes. If
  1329. the operator is defined but does not bind for a given template type,
  1330. it is still detected by the trait which returns <code class="computeroutput"><span class="keyword">true</span></code>
  1331. instead of <code class="computeroutput"><span class="keyword">false</span></code>. This
  1332. applies in particular to the containers of the standard library and
  1333. <code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code>.
  1334. Example:
  1335. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1336. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
  1337. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  1338. <span class="keyword">struct</span> <span class="identifier">contains</span> <span class="special">{</span> <span class="identifier">T</span> <span class="identifier">data</span><span class="special">;</span> <span class="special">};</span>
  1339. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  1340. <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">contains</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&amp;</span><span class="identifier">lhs</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">contains</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&amp;</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">{</span>
  1341. <span class="keyword">return</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">lhs</span><span class="special">.</span><span class="identifier">data</span><span class="special">,</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">data</span><span class="special">);</span>
  1342. <span class="special">}</span>
  1343. <span class="keyword">class</span> <span class="identifier">bad</span> <span class="special">{</span> <span class="special">};</span>
  1344. <span class="keyword">class</span> <span class="identifier">good</span> <span class="special">{</span> <span class="special">};</span>
  1345. <span class="keyword">bool</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">good</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">good</span><span class="special">&amp;)</span> <span class="special">{</span> <span class="special">}</span>
  1346. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  1347. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">boolalpha</span><span class="special">;</span>
  1348. <span class="comment">// works fine for contains&lt;good&gt;</span>
  1349. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span> <span class="identifier">contains</span><span class="special">&lt;</span> <span class="identifier">good</span> <span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">&lt;&lt;</span><span class="char">'\n'</span><span class="special">;</span> <span class="comment">// true</span>
  1350. <span class="identifier">contains</span><span class="special">&lt;</span><span class="identifier">good</span><span class="special">&gt;</span> <span class="identifier">g</span><span class="special">;</span>
  1351. <span class="identifier">g</span><span class="special">==</span><span class="identifier">g</span><span class="special">;</span> <span class="comment">// ok</span>
  1352. <span class="comment">// does not work for contains&lt;bad&gt;</span>
  1353. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span> <span class="identifier">contains</span><span class="special">&lt;</span> <span class="identifier">bad</span> <span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">&lt;&lt;</span><span class="char">'\n'</span><span class="special">;</span> <span class="comment">// true, should be false</span>
  1354. <span class="identifier">contains</span><span class="special">&lt;</span><span class="identifier">bad</span><span class="special">&gt;</span> <span class="identifier">b</span><span class="special">;</span>
  1355. <span class="identifier">b</span><span class="special">==</span><span class="identifier">b</span><span class="special">;</span> <span class="comment">// compile time error</span>
  1356. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  1357. <span class="special">}</span>
  1358. </pre>
  1359. </li>
  1360. <li class="listitem">
  1361. <code class="computeroutput"><span class="keyword">volatile</span></code> qualifier is
  1362. not properly handled and would lead to undefined behavior
  1363. </li>
  1364. </ul></div>
  1365. <h6>
  1366. <a name="boost_typetraits.category.value_traits.operators.h7"></a>
  1367. <span class="phrase"><a name="boost_typetraits.category.value_traits.operators.acknowledgments"></a></span><a class="link" href="operators.html#boost_typetraits.category.value_traits.operators.acknowledgments">Acknowledgments</a>
  1368. </h6>
  1369. <p>
  1370. Frederic Bron is very thankful to numerous people from the boost mailing
  1371. list for their kind help and patience. In particular, the following persons
  1372. have been very helpful for the implementation: Edward Diener, Eric Niebler,
  1373. Jeffrey Lee Hellrung (Jr.), Robert Stewart, Roman Perepelitsa, Steven Watanabe,
  1374. Vicente Botet.
  1375. </p>
  1376. </div>
  1377. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  1378. <td align="left"></td>
  1379. <td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
  1380. Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
  1381. Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
  1382. Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
  1383. Watanabe<p>
  1384. Distributed under the Boost Software License, Version 1.0. (See accompanying
  1385. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  1386. </p>
  1387. </div></td>
  1388. </tr></table>
  1389. <hr>
  1390. <div class="spirit-nav">
  1391. <a accesskey="p" href="relate.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../value_traits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../transform.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
  1392. </div>
  1393. </body>
  1394. </html>