forked from boostorg/mp11
Make the E parameter of mp_if optional
This commit is contained in:
@@ -84,7 +84,7 @@
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.utility.mp_identity_t"><code class="computeroutput"><span class="identifier">mp_identity</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.utility.mp_identity_t_t"><code class="computeroutput"><span class="identifier">mp_identity_t</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.utility.mp_inherit_t"><code class="computeroutput"><span class="identifier">mp_inherit</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.utility.mp_if_c_b_t_e"><code class="computeroutput"><span class="identifier">mp_if_c</span><span class="special"><</span><span class="identifier">B</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">></span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.utility.mp_if_c_b_t_e"><code class="computeroutput"><span class="identifier">mp_if_c</span><span class="special"><</span><span class="identifier">B</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">...></span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.utility.mp_if_c_t_e"><code class="computeroutput"><span class="identifier">mp_if</span><span class="special"><</span><span class="identifier">C</span><span class="special">,</span>
|
||||
<span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">></span></code></a></span></dt>
|
||||
<dt><span class="section"><a href="mp11.html#mp11.reference.utility.mp_eval_if_c_b_t_f_u"><code class="computeroutput"><span class="identifier">mp_eval_if_c</span><span class="special"><</span><span class="identifier">B</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">F</span><span class="special">,</span>
|
||||
@@ -1210,16 +1210,20 @@
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="mp11.reference.utility.mp_if_c_b_t_e"></a><a class="link" href="mp11.html#mp11.reference.utility.mp_if_c_b_t_e" title="mp_if_c<B, T, E>"><code class="computeroutput"><span class="identifier">mp_if_c</span><span class="special"><</span><span class="identifier">B</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">></span></code></a>
|
||||
<a name="mp11.reference.utility.mp_if_c_b_t_e"></a><a class="link" href="mp11.html#mp11.reference.utility.mp_if_c_b_t_e" title="mp_if_c<B, T, E...>"><code class="computeroutput"><span class="identifier">mp_if_c</span><span class="special"><</span><span class="identifier">B</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">...></span></code></a>
|
||||
</h4></div></div></div>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">bool</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">E</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">mp_if_c</span> <span class="special">=</span> <span class="comment">/*...*/</span><span class="special">;</span>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">bool</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">E</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">mp_if_c</span> <span class="special">=</span> <span class="comment">/*...*/</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">mp_if_c</span><span class="special"><</span><span class="identifier">B</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">></span></code>
|
||||
is an alias for <code class="computeroutput"><span class="identifier">T</span></code> when
|
||||
<code class="computeroutput"><span class="identifier">B</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>,
|
||||
for <code class="computeroutput"><span class="identifier">E</span></code> otherwise.
|
||||
<code class="computeroutput"><span class="identifier">mp_if_c</span><span class="special"><</span><span class="keyword">true</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">...></span></code>
|
||||
is an alias for <code class="computeroutput"><span class="identifier">T</span></code>. <code class="computeroutput"><span class="identifier">mp_if_c</span><span class="special"><</span><span class="keyword">false</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">></span></code> is an alias for <code class="computeroutput"><span class="identifier">E</span></code>.
|
||||
Otherwise, the result is a substitution failure.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">R1</span> <span class="special">=</span> <span class="identifier">mp_if_c</span><span class="special"><</span><span class="keyword">true</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">void</span><span class="special">>;</span> <span class="comment">// int</span>
|
||||
<span class="keyword">using</span> <span class="identifier">R2</span> <span class="special">=</span> <span class="identifier">mp_if_c</span><span class="special"><</span><span class="identifier">flase</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">void</span><span class="special">>;</span> <span class="comment">// void</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">I</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">void_if_5</span> <span class="special">=</span> <span class="identifier">mp_if_c</span><span class="special"><</span><span class="identifier">I</span><span class="special">::</span><span class="identifier">value</span> <span class="special">==</span> <span class="number">5</span><span class="special">,</span> <span class="keyword">void</span><span class="special">>;</span> <span class="comment">// `void` when `I::value` is 5, substitution failure otherwise</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
@@ -1229,10 +1233,8 @@
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">E</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">mp_if</span> <span class="special">=</span> <span class="identifier">mp_if_c</span><span class="special"><</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">bool</span><span class="special">>(</span><span class="identifier">C</span><span class="special">::</span><span class="identifier">value</span><span class="special">),</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">>;</span>
|
||||
</pre>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">mp_if</span><span class="special"><</span><span class="identifier">C</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">E</span><span class="special">></span></code>
|
||||
is an alias for <code class="computeroutput"><span class="identifier">T</span></code> when
|
||||
<code class="computeroutput"><span class="identifier">C</span><span class="special">::</span><span class="identifier">value</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>,
|
||||
for <code class="computeroutput"><span class="identifier">E</span></code> otherwise.
|
||||
Like <code class="computeroutput"><span class="identifier">mp_if_c</span></code>, but the first
|
||||
argument is a type.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
@@ -2315,7 +2317,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"><p><small>Last revised: May 18, 2017 at 11:17:12 GMT</small></p></td>
|
||||
<td align="left"><p><small>Last revised: May 18, 2017 at 11:57:59 GMT</small></p></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
|
@@ -23,16 +23,21 @@
|
||||
template<class... T> struct mp_inherit: T... {};
|
||||
[endsect]
|
||||
|
||||
[section `mp_if_c<B, T, E>`]
|
||||
template<bool C, class T, class E> using mp_if_c = /*...*/;
|
||||
[section `mp_if_c<B, T, E...>`]
|
||||
template<bool C, class T, class... E> using mp_if_c = /*...*/;
|
||||
|
||||
`mp_if_c<B, T, E>` is an alias for `T` when `B` is `true`, for `E` otherwise.
|
||||
`mp_if_c<true, T, E...>` is an alias for `T`. `mp_if_c<false, T, E>` is an alias for `E`. Otherwise, the result is a substitution failure.
|
||||
|
||||
using R1 = mp_if_c<true, int, void>; // int
|
||||
using R2 = mp_if_c<flase, int, void>; // void
|
||||
|
||||
template<class I> using void_if_5 = mp_if_c<I::value == 5, void>; // `void` when `I::value` is 5, substitution failure otherwise
|
||||
[endsect]
|
||||
|
||||
[section `mp_if<C, T, E>`]
|
||||
template<class C, class T, class E> using mp_if = mp_if_c<static_cast<bool>(C::value), T, E>;
|
||||
|
||||
`mp_if<C, T, E>` is an alias for `T` when `C::value` is `true`, for `E` otherwise.
|
||||
Like `mp_if_c`, but the first argument is a type.
|
||||
[endsect]
|
||||
|
||||
[section `mp_eval_if_c<B, T, F, U...>`]
|
||||
|
@@ -33,9 +33,11 @@ template<class... T> struct mp_inherit: T... {};
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<bool C, class T, class E> struct mp_if_c_impl;
|
||||
template<bool C, class T, class... E> struct mp_if_c_impl
|
||||
{
|
||||
};
|
||||
|
||||
template<class T, class E> struct mp_if_c_impl<true, T, E>
|
||||
template<class T, class... E> struct mp_if_c_impl<true, T, E...>
|
||||
{
|
||||
using type = T;
|
||||
};
|
||||
@@ -47,8 +49,8 @@ template<class T, class E> struct mp_if_c_impl<false, T, E>
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<bool C, class T, class E> using mp_if_c = typename detail::mp_if_c_impl<C, T, E>::type;
|
||||
template<class C, class T, class E> using mp_if = typename detail::mp_if_c_impl<static_cast<bool>(C::value), T, E>::type;
|
||||
template<bool C, class T, class... E> using mp_if_c = typename detail::mp_if_c_impl<C, T, E...>::type;
|
||||
template<class C, class T, class... E> using mp_if = typename detail::mp_if_c_impl<static_cast<bool>(C::value), T, E...>::type;
|
||||
|
||||
// mp_eval_if, mp_eval_if_c
|
||||
namespace detail
|
||||
|
@@ -75,6 +75,7 @@ run integral.cpp : : : $(REQ) ;
|
||||
run mp_identity.cpp : : : $(REQ) ;
|
||||
run mp_inherit.cpp : : : $(REQ) ;
|
||||
run mp_if.cpp : : : $(REQ) ;
|
||||
run mp_if_sf.cpp : : : $(REQ) ;
|
||||
run mp_eval_if.cpp : : : $(REQ) ;
|
||||
run mp_valid.cpp : : : $(REQ) ;
|
||||
run mp_defer.cpp : : : $(REQ) ;
|
||||
|
24
test/mp_if_sf.cpp
Normal file
24
test/mp_if_sf.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
// Copyright 2017 Peter Dimov.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
//
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
|
||||
#include <boost/mp11/utility.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
int main()
|
||||
{
|
||||
using boost::mp11::mp_if;
|
||||
using boost::mp11::mp_valid;
|
||||
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<mp_if, std::false_type, void>));
|
||||
BOOST_TEST_TRAIT_TRUE((mp_valid<mp_if, std::false_type, void, void>));
|
||||
BOOST_TEST_TRAIT_FALSE((mp_valid<mp_if, std::false_type, void, void, void>));
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
Reference in New Issue
Block a user