• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>enable_if</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 1. Boost.Core">
8<link rel="up" href="../index.html" title="Chapter 1. Boost.Core">
9<link rel="prev" href="empty_value.html" title="empty_value">
10<link rel="next" href="exchange.html" title="exchange">
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="empty_value.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="exchange.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h2 class="title" style="clear: both">
27<a name="core.enable_if"></a><a class="link" href="enable_if.html" title="enable_if">enable_if</a>
28</h2></div></div></div>
29<div class="toc"><dl class="toc">
30<dt><span class="section"><a href="enable_if.html#core.enable_if.introduction">Introduction</a></span></dt>
31<dt><span class="section"><a href="enable_if.html#core.enable_if.the_enable_if_templates">The enable_if
32      templates</a></span></dt>
33<dt><span class="section"><a href="enable_if.html#core.enable_if.using_enable_if">Using enable_if</a></span></dt>
34<dt><span class="section"><a href="enable_if.html#core.enable_if.acknowledgements">Acknowledgements</a></span></dt>
35<dt><span class="section"><a href="enable_if.html#core.enable_if.references">References</a></span></dt>
36</dl></div>
37<div class="simplesect">
38<div class="titlepage"><div><div><h3 class="title">
39<a name="idm45312829399232"></a>Authors</h3></div></div></div>
40<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
41<li class="listitem">
42          Jaakko Järvi
43        </li>
44<li class="listitem">
45          Jeremiah Willcock
46        </li>
47<li class="listitem">
48          Andrew Lumsdaine
49        </li>
50</ul></div>
51</div>
52<div class="section">
53<div class="titlepage"><div><div><h3 class="title">
54<a name="core.enable_if.introduction"></a><a class="link" href="enable_if.html#core.enable_if.introduction" title="Introduction">Introduction</a>
55</h3></div></div></div>
56<p>
57        The <code class="computeroutput"><span class="identifier">enable_if</span></code> family of templates
58        is a set of tools to allow a function template or a class template specialization
59        to include or exclude itself from a set of matching functions or specializations
60        based on properties of its template arguments. For example, one can define
61        function templates that are only enabled for, and thus only match, an arbitrary
62        set of types defined by a traits class. The <code class="computeroutput"><span class="identifier">enable_if</span></code>
63        templates can also be applied to enable class template specializations. Applications
64        of <code class="computeroutput"><span class="identifier">enable_if</span></code> are discussed
65        in length in <a class="link" href="enable_if.html#REF1">[1]</a> and <a class="link" href="enable_if.html#REF2">[2]</a>.
66      </p>
67<div class="section">
68<div class="titlepage"><div><div><h4 class="title">
69<a name="core.enable_if.introduction.header_boost_core_enable_if_hpp"></a><a class="link" href="enable_if.html#core.enable_if.introduction.header_boost_core_enable_if_hpp" title="Header &lt;boost/core/enable_if.hpp&gt;">Header
70        &lt;boost/core/enable_if.hpp&gt;</a>
71</h4></div></div></div>
72<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
73    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Cond</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">enable_if</span><span class="special">;</span>
74    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Cond</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">disable_if</span><span class="special">;</span>
75    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Cond</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">lazy_enable_if</span><span class="special">;</span>
76    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Cond</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">lazy_disable_if</span><span class="special">;</span>
77
78    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">bool</span> <span class="identifier">B</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">enable_if_c</span><span class="special">;</span>
79    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">bool</span> <span class="identifier">B</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">disable_if_c</span><span class="special">;</span>
80    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">bool</span> <span class="identifier">B</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">lazy_enable_if_c</span><span class="special">;</span>
81    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">bool</span> <span class="identifier">B</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">lazy_disable_if_c</span><span class="special">;</span>
82<span class="special">}</span>
83</pre>
84</div>
85<div class="section">
86<div class="titlepage"><div><div><h4 class="title">
87<a name="core.enable_if.introduction.background"></a><a class="link" href="enable_if.html#core.enable_if.introduction.background" title="Background">Background</a>
88</h4></div></div></div>
89<p>
90          Sensible operation of template function overloading in C++ relies on the
91          <span class="emphasis"><em>SFINAE</em></span> (substitution-failure-is-not-an-error) principle
92          <a class="link" href="enable_if.html#REF3">[3]</a>: if an invalid argument or return type
93          is formed during the instantiation of a function template, the instantiation
94          is removed from the overload resolution set instead of causing a compilation
95          error. The following example, taken from <a class="link" href="enable_if.html#REF1">[1]</a>,
96          demonstrates why this is important:
97        </p>
98<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">negate</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">-</span><span class="identifier">i</span><span class="special">;</span> <span class="special">}</span>
99
100<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
101<span class="keyword">typename</span> <span class="identifier">F</span><span class="special">::</span><span class="identifier">result_type</span> <span class="identifier">negate</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">F</span><span class="special">&amp;</span> <span class="identifier">f</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">-</span><span class="identifier">f</span><span class="special">();</span> <span class="special">}</span>
102</pre>
103<p>
104          Suppose the compiler encounters the call <code class="computeroutput"><span class="identifier">negate</span><span class="special">(</span><span class="number">1</span><span class="special">)</span></code>.
105          The first definition is obviously a better match, but the compiler must
106          nevertheless consider (and instantiate the prototypes) of both definitions
107          to find this out. Instantiating the latter definition with <code class="computeroutput"><span class="identifier">F</span></code> as <code class="computeroutput"><span class="keyword">int</span></code>
108          would result in:
109        </p>
110<pre class="programlisting"><span class="keyword">int</span><span class="special">::</span><span class="identifier">result_type</span> <span class="identifier">negate</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">int</span><span class="special">&amp;);</span>
111</pre>
112<p>
113          where the return type is invalid. If this were an error, adding an unrelated
114          function template (that was never called) could break otherwise valid code.
115          Due to the SFINAE principle the above example is not, however, erroneous.
116          The latter definition of <code class="computeroutput"><span class="identifier">negate</span></code>
117          is simply removed from the overload resolution set.
118        </p>
119<p>
120          The <code class="computeroutput"><span class="identifier">enable_if</span></code> templates
121          are tools for controlled creation of the SFINAE conditions.
122        </p>
123</div>
124</div>
125<div class="section">
126<div class="titlepage"><div><div><h3 class="title">
127<a name="core.enable_if.the_enable_if_templates"></a><a class="link" href="enable_if.html#core.enable_if.the_enable_if_templates" title="The enable_if templates">The enable_if
128      templates</a>
129</h3></div></div></div>
130<p>
131        The names of the <code class="computeroutput"><span class="identifier">enable_if</span></code>
132        templates have three parts: an optional <code class="computeroutput"><span class="identifier">lazy_</span></code>
133        tag, either <code class="computeroutput"><span class="identifier">enable_if</span></code> or
134        <code class="computeroutput"><span class="identifier">disable_if</span></code>, and an optional
135        <code class="computeroutput"><span class="identifier">_c</span></code> tag. All eight combinations
136        of these parts are supported. The meaning of the <code class="computeroutput"><span class="identifier">lazy_</span></code>
137        tag is described in the section <a class="link" href="enable_if.html#core.enable_if.using_enable_if.enable_if_lazy" title="Lazy enable_if">below</a>.
138        The second part of the name indicates whether a true condition argument should
139        enable or disable the current overload. The third part of the name indicates
140        whether the condition argument is a <code class="computeroutput"><span class="keyword">bool</span></code>
141        value (<code class="computeroutput"><span class="identifier">_c</span></code> suffix), or a type
142        containing a static <code class="computeroutput"><span class="keyword">bool</span></code> constant
143        named <code class="computeroutput"><span class="identifier">value</span></code> (no suffix).
144        The latter version interoperates with Boost.MPL.
145      </p>
146<p>
147        The definitions of <code class="computeroutput"><span class="identifier">enable_if_c</span></code>
148        and <code class="computeroutput"><span class="identifier">enable_if</span></code> are as follows
149        (we use <code class="computeroutput"><span class="identifier">enable_if</span></code> templates
150        unqualified but they are in the <code class="computeroutput"><span class="identifier">boost</span></code>
151        namespace).
152      </p>
153<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">bool</span> <span class="identifier">B</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span>
154<span class="keyword">struct</span> <span class="identifier">enable_if_c</span> <span class="special">{</span>
155    <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">type</span><span class="special">;</span>
156<span class="special">};</span>
157
158<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>
159<span class="keyword">struct</span> <span class="identifier">enable_if_c</span><span class="special">&lt;</span><span class="keyword">false</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="special">{};</span>
160
161<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Cond</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span>
162<span class="keyword">struct</span> <span class="identifier">enable_if</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">enable_if_c</span><span class="special">&lt;</span><span class="identifier">Cond</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="special">{};</span>
163</pre>
164<p>
165        An instantiation of the <code class="computeroutput"><span class="identifier">enable_if_c</span></code>
166        template with the parameter <code class="computeroutput"><span class="identifier">B</span></code>
167        as <code class="computeroutput"><span class="keyword">true</span></code> contains a member type
168        <code class="computeroutput"><span class="identifier">type</span></code>, defined to be <code class="computeroutput"><span class="identifier">T</span></code>. If <code class="computeroutput"><span class="identifier">B</span></code>
169        is <code class="computeroutput"><span class="keyword">false</span></code>, no such member is
170        defined. Thus <code class="computeroutput"><span class="identifier">enable_if_c</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">,</span>
171        <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span></code> is either a valid or an invalid type
172        expression, depending on the value of <code class="computeroutput"><span class="identifier">B</span></code>.
173        When valid, <code class="computeroutput"><span class="identifier">enable_if_c</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span></code>
174        equals <code class="computeroutput"><span class="identifier">T</span></code>. The <code class="computeroutput"><span class="identifier">enable_if_c</span></code> template can thus be used for
175        controlling when functions are considered for overload resolution and when
176        they are not. For example, the following function is defined for all arithmetic
177        types (according to the classification of the Boost <span class="bold"><strong>type_traits</strong></span>
178        library):
179      </p>
180<pre class="programlisting"><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>
181<span class="keyword">typename</span> <span class="identifier">enable_if_c</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
182<span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">t</span><span class="special">;</span> <span class="special">}</span>
183</pre>
184<p>
185        The <code class="computeroutput"><span class="identifier">disable_if_c</span></code> template
186        is provided as well, and has the same functionality as <code class="computeroutput"><span class="identifier">enable_if_c</span></code>
187        except for the negated condition. The following function is enabled for all
188        non-arithmetic types.
189      </p>
190<pre class="programlisting"><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>
191<span class="keyword">typename</span> <span class="identifier">disable_if_c</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
192<span class="identifier">bar</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">t</span><span class="special">;</span> <span class="special">}</span>
193</pre>
194<p>
195        For easier syntax in some cases and interoperation with Boost.MPL we provide
196        versions of the <code class="computeroutput"><span class="identifier">enable_if</span></code>
197        templates taking any type with a <code class="computeroutput"><span class="keyword">bool</span></code>
198        member constant named <code class="computeroutput"><span class="identifier">value</span></code>
199        as the condition argument. The MPL <code class="computeroutput"><span class="identifier">bool_</span></code>,
200        <code class="computeroutput"><span class="identifier">and_</span></code>, <code class="computeroutput"><span class="identifier">or_</span></code>,
201        and <code class="computeroutput"><span class="identifier">not_</span></code> templates are likely
202        to be useful for creating such types. Also, the traits classes in the Boost.Type_traits
203        library follow this convention. For example, the above example function
204        <code class="computeroutput"><span class="identifier">foo</span></code> can be alternatively
205        written as:
206      </p>
207<pre class="programlisting"><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>
208<span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
209<span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">t</span><span class="special">;</span> <span class="special">}</span>
210</pre>
211</div>
212<div class="section">
213<div class="titlepage"><div><div><h3 class="title">
214<a name="core.enable_if.using_enable_if"></a><a class="link" href="enable_if.html#core.enable_if.using_enable_if" title="Using enable_if">Using enable_if</a>
215</h3></div></div></div>
216<p>
217        The <code class="computeroutput"><span class="identifier">enable_if</span></code> templates are
218        defined in <code class="computeroutput"><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">/</span><span class="identifier">enable_if</span><span class="special">.</span><span class="identifier">hpp</span></code>, which is included by <code class="computeroutput"><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">.</span><span class="identifier">hpp</span></code>.
219      </p>
220<p>
221        With respect to function templates, <code class="computeroutput"><span class="identifier">enable_if</span></code>
222        can be used in multiple different ways:
223      </p>
224<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
225<li class="listitem">
226            As the return type of an instantiatied function
227          </li>
228<li class="listitem">
229            As an extra parameter of an instantiated function
230          </li>
231<li class="listitem">
232            As an extra template parameter (useful only in a compiler that supports
233            C++0x default arguments for function template parameters, see <a class="link" href="enable_if.html#core.enable_if.using_enable_if.enable_if_0x" title="Enabling function templates in C++0x">Enabling
234            function templates in C++0x</a> for details.
235          </li>
236</ul></div>
237<p>
238        In the previous section, the return type form of <code class="computeroutput"><span class="identifier">enable_if</span></code>
239        was shown. As an example of using the form of <code class="computeroutput"><span class="identifier">enable_if</span></code>
240        that works via an extra function parameter, the <code class="computeroutput"><span class="identifier">foo</span></code>
241        function in the previous section could also be written as:
242      </p>
243<pre class="programlisting"><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>
244<span class="identifier">T</span> <span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">,</span>
245    <span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span><span class="special">*</span> <span class="identifier">dummy</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
246</pre>
247<p>
248        Hence, an extra parameter of type <code class="computeroutput"><span class="keyword">void</span><span class="special">*</span></code> is added, but it is given a default value
249        to keep the parameter hidden from client code. Note that the second template
250        argument was not given to <code class="computeroutput"><span class="identifier">enable_if</span></code>,
251        as the default <code class="computeroutput"><span class="keyword">void</span></code> gives the
252        desired behavior.
253      </p>
254<p>
255        Which way to write the enabler is largely a matter of taste, but for certain
256        functions, only a subset of the options is possible:
257      </p>
258<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
259<li class="listitem">
260            Many operators have a fixed number of arguments, thus <code class="computeroutput"><span class="identifier">enable_if</span></code>
261            must be used either in the return type or in an extra template parameter.
262          </li>
263<li class="listitem">
264            Functions that have a variadic parameter list must use either the return
265            type form or an extra template parameter.
266          </li>
267<li class="listitem">
268            Constructors do not have a return type so you must use either an extra
269            function parameter or an extra template parameter.
270          </li>
271<li class="listitem">
272            Constructors that have a variadic parameter list must an extra template
273            parameter.
274          </li>
275<li class="listitem">
276            Conversion operators can only be written with an extra template parameter.
277          </li>
278</ul></div>
279<div class="section">
280<div class="titlepage"><div><div><h4 class="title">
281<a name="core.enable_if.using_enable_if.enable_if_0x"></a><a class="link" href="enable_if.html#core.enable_if.using_enable_if.enable_if_0x" title="Enabling function templates in C++0x">Enabling
282        function templates in C++0x</a>
283</h4></div></div></div>
284<p>
285          In a compiler which supports C++0x default arguments for function template
286          parameters, you can enable and disable function templates by adding an
287          additional template parameter. This approach works in all situations where
288          you would use either the return type form of <code class="computeroutput"><span class="identifier">enable_if</span></code>
289          or the function parameter form, including operators, constructors, variadic
290          function templates, and even overloaded conversion operations.
291        </p>
292<p>
293          As an example:
294        </p>
295<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">is_arithmetic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
296<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">is_pointer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
297<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">/</span><span class="identifier">enable_if</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
298
299<span class="keyword">class</span> <span class="identifier">test</span>
300<span class="special">{</span>
301<span class="keyword">public</span><span class="special">:</span>
302    <span class="comment">// A constructor that works for any argument list of size 10</span>
303    <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">,</span>
304        <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_if_c</span><span class="special">&lt;</span> <span class="keyword">sizeof</span><span class="special">...(</span> <span class="identifier">T</span> <span class="special">)</span> <span class="special">==</span> <span class="number">10</span><span class="special">,</span>
305            <span class="keyword">int</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">=</span> <span class="number">0</span><span class="special">&gt;</span>
306    <span class="identifier">test</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;...</span> <span class="special">);</span>
307
308    <span class="comment">// A conversion operation that can convert to any arithmetic type</span>
309    <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span>
310        <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_if</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;,</span>
311            <span class="keyword">int</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">=</span> <span class="number">0</span><span class="special">&gt;</span>
312    <span class="keyword">operator</span> <span class="identifier">T</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
313
314    <span class="comment">// A conversion operation that can convert to any pointer type</span>
315    <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span>
316        <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_if</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_pointer</span><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;,</span>
317            <span class="keyword">int</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">=</span> <span class="number">0</span><span class="special">&gt;</span>
318    <span class="keyword">operator</span> <span class="identifier">T</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
319<span class="special">};</span>
320
321<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
322<span class="special">{</span>
323    <span class="comment">// Works</span>
324    <span class="identifier">test</span> <span class="identifier">test_</span><span class="special">(</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">6</span><span class="special">,</span> <span class="number">7</span><span class="special">,</span> <span class="number">8</span><span class="special">,</span> <span class="number">9</span><span class="special">,</span> <span class="number">10</span> <span class="special">);</span>
325
326    <span class="comment">// Fails as expected</span>
327    <span class="identifier">test</span> <span class="identifier">fail_construction</span><span class="special">(</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span> <span class="special">);</span>
328
329    <span class="comment">// Works by calling the conversion operator enabled for arithmetic types</span>
330    <span class="keyword">int</span> <span class="identifier">arithmetic_object</span> <span class="special">=</span> <span class="identifier">test_</span><span class="special">;</span>
331
332    <span class="comment">// Works by calling the conversion operator enabled for pointer types</span>
333    <span class="keyword">int</span><span class="special">*</span> <span class="identifier">pointer_object</span> <span class="special">=</span> <span class="identifier">test_</span><span class="special">;</span>
334
335    <span class="comment">// Fails as expected</span>
336    <span class="keyword">struct</span> <span class="special">{}</span> <span class="identifier">fail_conversion</span> <span class="special">=</span> <span class="identifier">test_</span><span class="special">;</span>
337<span class="special">}</span>
338</pre>
339</div>
340<div class="section">
341<div class="titlepage"><div><div><h4 class="title">
342<a name="core.enable_if.using_enable_if.enabling_template_class_speciali"></a><a class="link" href="enable_if.html#core.enable_if.using_enable_if.enabling_template_class_speciali" title="Enabling template class specializations">Enabling
343        template class specializations</a>
344</h4></div></div></div>
345<p>
346          Class template specializations can be enabled or disabled with <code class="computeroutput"><span class="identifier">enable_if</span></code>. One extra template parameter
347          needs to be added for the enabler expressions. This parameter has the default
348          value <code class="computeroutput"><span class="keyword">void</span></code>. For example:
349        </p>
350<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Enable</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span>
351<span class="keyword">class</span> <span class="identifier">A</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span>
352
353<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>
354<span class="keyword">class</span> <span class="identifier">A</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">is_integral</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span>
355
356<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>
357<span class="keyword">class</span> <span class="identifier">A</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">is_float</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span>
358</pre>
359<p>
360          Instantiating <code class="computeroutput"><span class="identifier">A</span></code> with any
361          integral type matches the first specialization, whereas any floating point
362          type matches the second one. All other types match the primary template.
363          The condition can be any compile-time boolean expression that depends on
364          the template arguments of the class. Note that again, the second argument
365          to <code class="computeroutput"><span class="identifier">enable_if</span></code> is not needed;
366          the default (<code class="computeroutput"><span class="keyword">void</span></code>) is the
367          correct value.
368        </p>
369<p>
370          The <code class="computeroutput"><span class="identifier">enable_if_has_type</span></code>
371          template is usable this scenario but instead of using a type traits to
372          enable or disable a specialization, it use a SFINAE context to check for
373          the existence of a dependent type inside its parameter. For example, the
374          following structure extracts a dependent <code class="computeroutput"><span class="identifier">value_type</span></code>
375          from T if and only if <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">value_type</span></code>
376          exists.
377        </p>
378<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Enable</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span>
379<span class="keyword">class</span> <span class="identifier">value_type_from</span>
380<span class="special">{</span>
381  <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">type</span><span class="special">;</span>
382<span class="special">};</span>
383
384<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>
385<span class="keyword">class</span> <span class="identifier">value_type_from</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">enable_if_has_type</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
386<span class="special">{</span>
387  <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">type</span><span class="special">;</span>
388<span class="special">};</span>
389</pre>
390</div>
391<div class="section">
392<div class="titlepage"><div><div><h4 class="title">
393<a name="core.enable_if.using_enable_if.overlapping_enabler_conditions"></a><a class="link" href="enable_if.html#core.enable_if.using_enable_if.overlapping_enabler_conditions" title="Overlapping enabler conditions">Overlapping
394        enabler conditions</a>
395</h4></div></div></div>
396<p>
397          Once the compiler has examined the enabling conditions and included the
398          function into the overload resolution set, normal C++ overload resolution
399          rules are used to select the best matching function. In particular, there
400          is no ordering between enabling conditions. Function templates with enabling
401          conditions that are not mutually exclusive can lead to ambiguities. For
402          example:
403        </p>
404<pre class="programlisting"><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>
405<span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_integral</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">type</span>
406<span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">)</span> <span class="special">{}</span>
407
408<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>
409<span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">type</span>
410<span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">)</span> <span class="special">{}</span>
411</pre>
412<p>
413          All integral types are also arithmetic. Therefore, say, for the call <code class="computeroutput"><span class="identifier">foo</span><span class="special">(</span><span class="number">1</span><span class="special">)</span></code>, both
414          conditions are true and both functions are thus in the overload resolution
415          set. They are both equally good matches and thus ambiguous. Of course,
416          more than one enabling condition can be simultaneously true as long as
417          other arguments disambiguate the functions.
418        </p>
419<p>
420          The above discussion applies to using <code class="computeroutput"><span class="identifier">enable_if</span></code>
421          in class template partial specializations as well.
422        </p>
423</div>
424<div class="section">
425<div class="titlepage"><div><div><h4 class="title">
426<a name="core.enable_if.using_enable_if.enable_if_lazy"></a><a class="link" href="enable_if.html#core.enable_if.using_enable_if.enable_if_lazy" title="Lazy enable_if">Lazy
427        enable_if</a>
428</h4></div></div></div>
429<p>
430          In some cases it is necessary to avoid instantiating part of a function
431          signature unless an enabling condition is true. For example:
432        </p>
433<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">mult_traits</span><span class="special">;</span>
434
435<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span>
436<span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">is_multipliable</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">&gt;,</span>
437    <span class="keyword">typename</span> <span class="identifier">mult_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">type</span>
438<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">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&amp;</span> <span class="identifier">u</span><span class="special">)</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
439</pre>
440<p>
441          Assume the class template <code class="computeroutput"><span class="identifier">mult_traits</span></code>
442          is a traits class defining the resulting type of a multiplication operator.
443          The <code class="computeroutput"><span class="identifier">is_multipliable</span></code> traits
444          class specifies for which types to enable the operator. Whenever <code class="computeroutput"><span class="identifier">is_multipliable</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
445          is <code class="computeroutput"><span class="keyword">true</span></code> for some types <code class="computeroutput"><span class="identifier">A</span></code> and <code class="computeroutput"><span class="identifier">B</span></code>,
446          then <code class="computeroutput"><span class="identifier">mult_traits</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;::</span><span class="identifier">type</span></code>
447          is defined.
448        </p>
449<p>
450          Now, trying to invoke (some other overload) of <code class="computeroutput"><span class="keyword">operator</span><span class="special">*</span></code> with, say, operand types <code class="computeroutput"><span class="identifier">C</span></code> and <code class="computeroutput"><span class="identifier">D</span></code>
451          for which <code class="computeroutput"><span class="identifier">is_multipliable</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">,</span> <span class="identifier">D</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is <code class="computeroutput"><span class="keyword">false</span></code>
452          and <code class="computeroutput"><span class="identifier">mult_traits</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">,</span> <span class="identifier">D</span><span class="special">&gt;::</span><span class="identifier">type</span></code>
453          is not defined is an error on some compilers. The SFINAE principle is not
454          applied because the invalid type occurs as an argument to another template.
455          The <code class="computeroutput"><span class="identifier">lazy_enable_if</span></code> and
456          <code class="computeroutput"><span class="identifier">lazy_disable_if</span></code> templates
457          (and their <code class="computeroutput"><span class="identifier">_c</span></code> versions)
458          can be used in such situations:
459        </p>
460<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span>
461<span class="keyword">typename</span> <span class="identifier">lazy_enable_if</span><span class="special">&lt;</span><span class="identifier">is_multipliable</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">&gt;,</span>
462    <span class="identifier">mult_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span>
463<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">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&amp;</span> <span class="identifier">u</span><span class="special">)</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
464</pre>
465<p>
466          The second argument of <code class="computeroutput"><span class="identifier">lazy_enable_if</span></code>
467          must be a class type that defines a nested type named <code class="computeroutput"><span class="identifier">type</span></code>
468          whenever the first parameter (the condition) is true.
469        </p>
470<div class="note"><table border="0" summary="Note">
471<tr>
472<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
473<th align="left">Note</th>
474</tr>
475<tr><td align="left" valign="top"><p>
476            Referring to one member type or static constant in a traits class causes
477            all of the members (type and static constant) of that specialization
478            to be instantiated. Therefore, if your traits classes can sometimes contain
479            invalid types, you should use two distinct templates for describing the
480            conditions and the type mappings. In the above example, <code class="computeroutput"><span class="identifier">is_multipliable</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">&gt;::</span><span class="identifier">value</span></code> defines when <code class="computeroutput"><span class="identifier">mult_traits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">&gt;::</span><span class="identifier">type</span></code>
481            is valid.
482          </p></td></tr>
483</table></div>
484</div>
485<div class="section">
486<div class="titlepage"><div><div><h4 class="title">
487<a name="core.enable_if.using_enable_if.compiler_workarounds"></a><a class="link" href="enable_if.html#core.enable_if.using_enable_if.compiler_workarounds" title="Compiler workarounds">Compiler
488        workarounds</a>
489</h4></div></div></div>
490<p>
491          Some compilers flag functions as ambiguous if the only distinguishing factor
492          is a different condition in an enabler (even though the functions could
493          never be ambiguous). For example, some compilers (e.g. GCC 3.2) diagnose
494          the following two functions as ambiguous:
495        </p>
496<pre class="programlisting"><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>
497<span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
498<span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">);</span>
499
500<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>
501<span class="keyword">typename</span> <span class="identifier">disable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
502<span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">);</span>
503</pre>
504<p>
505          Two workarounds can be applied:
506        </p>
507<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
508<li class="listitem">
509<p class="simpara">
510              Use an extra dummy parameter which disambiguates the functions. Use
511              a default value for it to hide the parameter from the caller. For example:
512            </p>
513<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">dummy</span> <span class="special">{</span> <span class="identifier">dummy</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="special">{}</span> <span class="special">};</span>
514
515<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>
516<span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
517<span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">,</span> <span class="identifier">dummy</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
518
519<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>
520<span class="keyword">typename</span> <span class="identifier">disable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
521<span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">,</span> <span class="identifier">dummy</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
522</pre>
523</li>
524<li class="listitem">
525<p class="simpara">
526              Define the functions in different namespaces and bring them into a
527              common namespace with <code class="computeroutput"><span class="keyword">using</span></code>
528              declarations:
529            </p>
530<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">A</span> <span class="special">{</span>
531    <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>
532    <span class="keyword">typename</span> <span class="identifier">enable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
533    <span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">);</span>
534<span class="special">}</span>
535
536<span class="keyword">namespace</span> <span class="identifier">B</span> <span class="special">{</span>
537    <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>
538    <span class="keyword">typename</span> <span class="identifier">disable_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_arithmetic</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span>
539    <span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">);</span>
540<span class="special">}</span>
541
542<span class="keyword">using</span> <span class="identifier">A</span><span class="special">::</span><span class="identifier">foo</span><span class="special">;</span>
543<span class="keyword">using</span> <span class="identifier">B</span><span class="special">::</span><span class="identifier">foo</span><span class="special">;</span>
544</pre>
545<p class="simpara">
546              Note that the second workaround above cannot be used for member templates.
547              On the other hand, operators do not accept extra arguments, which makes
548              the first workaround unusable. As the net effect, neither of the workarounds
549              are of assistance for templated operators that need to be defined as
550              member functions (assignment and subscript operators).
551            </p>
552</li>
553</ul></div>
554</div>
555</div>
556<div class="section">
557<div class="titlepage"><div><div><h3 class="title">
558<a name="core.enable_if.acknowledgements"></a><a class="link" href="enable_if.html#core.enable_if.acknowledgements" title="Acknowledgements">Acknowledgements</a>
559</h3></div></div></div>
560<p>
561        We are grateful to Howard Hinnant, Jason Shirk, Paul Mensonides, and Richard
562        Smith whose findings have influenced the library.
563      </p>
564</div>
565<div class="section">
566<div class="titlepage"><div><div><h3 class="title">
567<a name="core.enable_if.references"></a><a class="link" href="enable_if.html#core.enable_if.references" title="References">References</a>
568</h3></div></div></div>
569<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
570<li class="listitem">
571            <a name="REF1"></a>[1] Jaakko Järvi, Jeremiah Willcock, Howard Hinnant,
572            and Andrew Lumsdaine. Function overloading based on arbitrary properties
573            of types. <span class="emphasis"><em>C++ Users Journal</em></span>, 21(6):25--32, June
574            2003.
575          </li>
576<li class="listitem">
577            <a name="REF2"></a>[2] Jaakko Järvi, Jeremiah Willcock, and Andrew
578            Lumsdaine. Concept-controlled polymorphism. In Frank Pfennig and Yannis
579            Smaragdakis, editors, <span class="emphasis"><em>Generative Programming and Component
580            Engineering</em></span>, volume 2830 of <span class="emphasis"><em>LNCS</em></span>, pages
581            228--244. Springer Verlag, September 2003.
582          </li>
583<li class="listitem">
584            <a name="REF3"></a>[3] David Vandevoorde and Nicolai M. Josuttis. <span class="emphasis"><em>C++
585            Templates: The Complete Guide</em></span>. Addison-Wesley, 2002.
586          </li>
587</ul></div>
588</div>
589</div>
590<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
591<td align="left"></td>
592<td align="right"><div class="copyright-footer">Copyright © 2014 Peter Dimov<br>Copyright © 2014 Glen Fernandes<br>Copyright © 2014 Andrey Semashev<p>
593        Distributed under the <a href="http://boost.org/LICENSE_1_0.txt" target="_top">Boost
594        Software License, Version 1.0</a>.
595      </p>
596</div></td>
597</tr></table>
598<hr>
599<div class="spirit-nav">
600<a accesskey="p" href="empty_value.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="exchange.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
601</div>
602</body>
603</html>
604