forked from boostorg/mp11
Remove bind_front functionality from mp_quote
This commit is contained in:
@@ -92,7 +92,7 @@
|
|||||||
<span class="identifier">U</span><span class="special">...></span></code></a></span></dt>
|
<span class="identifier">U</span><span class="special">...></span></code></a></span></dt>
|
||||||
<dt><span class="section"><a href="mp11.html#mp11.reference.utility.mp_valid_f_t"><code class="computeroutput"><span class="identifier">mp_valid</span><span class="special"><</span><span class="identifier">F</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_valid_f_t"><code class="computeroutput"><span class="identifier">mp_valid</span><span class="special"><</span><span class="identifier">F</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_defer_f_t"><code class="computeroutput"><span class="identifier">mp_defer</span><span class="special"><</span><span class="identifier">F</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_defer_f_t"><code class="computeroutput"><span class="identifier">mp_defer</span><span class="special"><</span><span class="identifier">F</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_quote_f_t"><code class="computeroutput"><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</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_quote_f"><code class="computeroutput"><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span></code></a></span></dt>
|
||||||
<dt><span class="section"><a href="mp11.html#mp11.reference.utility.mp_invoke_q_t"><code class="computeroutput"><span class="identifier">mp_invoke</span><span class="special"><</span><span class="identifier">Q</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_invoke_q_t"><code class="computeroutput"><span class="identifier">mp_invoke</span><span class="special"><</span><span class="identifier">Q</span><span class="special">,</span> <span class="identifier">T</span><span class="special">...></span></code></a></span></dt>
|
||||||
</dl></dd>
|
</dl></dd>
|
||||||
<dt><span class="section"><a href="mp11.html#mp11.reference.algorithm">Algorithms, <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mp11</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
|
<dt><span class="section"><a href="mp11.html#mp11.reference.algorithm">Algorithms, <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mp11</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a></span></dt>
|
||||||
@@ -934,20 +934,19 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="section">
|
<div class="section">
|
||||||
<div class="titlepage"><div><div><h4 class="title">
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
<a name="mp11.reference.utility.mp_quote_f_t"></a><a class="link" href="mp11.html#mp11.reference.utility.mp_quote_f_t" title="mp_quote<F, T...>"><code class="computeroutput"><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</span><span class="special">,</span> <span class="identifier">T</span><span class="special">...></span></code></a>
|
<a name="mp11.reference.utility.mp_quote_f"></a><a class="link" href="mp11.html#mp11.reference.utility.mp_quote_f" title="mp_quote<F>"><code class="computeroutput"><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span></code></a>
|
||||||
</h4></div></div></div>
|
</h4></div></div></div>
|
||||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span><span class="special">...></span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">struct</span> <span class="identifier">mp_quote</span>
|
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span><span class="special">...></span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> <span class="keyword">struct</span> <span class="identifier">mp_quote</span>
|
||||||
<span class="special">{</span>
|
<span class="special">{</span>
|
||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">U</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">fn</span> <span class="special">=</span> <span class="identifier">F</span><span class="special"><</span><span class="identifier">T</span><span class="special">...,</span> <span class="identifier">U</span><span class="special">...>;</span>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">fn</span> <span class="special">=</span> <span class="identifier">F</span><span class="special"><</span><span class="identifier">T</span><span class="special">...>;</span>
|
||||||
<span class="special">};</span>
|
<span class="special">};</span>
|
||||||
</pre>
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
<code class="computeroutput"><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</span><span class="special">,</span> <span class="identifier">T</span><span class="special">...></span></code> transforms the template <code class="computeroutput"><span class="identifier">F</span></code> into a type. In the common case <code class="computeroutput"><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span></code>,
|
<code class="computeroutput"><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span></code>
|
||||||
the nested template <code class="computeroutput"><span class="identifier">fn</span></code>
|
transforms the template <code class="computeroutput"><span class="identifier">F</span></code>
|
||||||
of the result is an alias for <code class="computeroutput"><span class="identifier">F</span></code>;
|
into a type with a nested template <code class="computeroutput"><span class="identifier">fn</span></code>
|
||||||
otherwise, <code class="computeroutput"><span class="identifier">fn</span><span class="special"><</span><span class="identifier">U</span><span class="special">...></span></code>
|
such that <code class="computeroutput"><span class="identifier">fn</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code>
|
||||||
is an alias for <code class="computeroutput"><span class="identifier">F</span><span class="special"><</span><span class="identifier">T</span><span class="special">...,</span> <span class="identifier">U</span><span class="special">...></span></code>,
|
returns <code class="computeroutput"><span class="identifier">F</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code>.
|
||||||
allowing partial application.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section">
|
<div class="section">
|
||||||
@@ -958,8 +957,7 @@
|
|||||||
</pre>
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
<code class="computeroutput"><span class="identifier">mp_invoke</span><span class="special"><</span><span class="identifier">Q</span><span class="special">,</span> <span class="identifier">T</span><span class="special">...></span></code> evaluates the nested template <code class="computeroutput"><span class="identifier">fn</span></code> of a quoted metafunction. <code class="computeroutput"><span class="identifier">mp_invoke</span><span class="special"><</span><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</span><span class="special">>,</span> <span class="identifier">T</span><span class="special">...></span></code>
|
<code class="computeroutput"><span class="identifier">mp_invoke</span><span class="special"><</span><span class="identifier">Q</span><span class="special">,</span> <span class="identifier">T</span><span class="special">...></span></code> evaluates the nested template <code class="computeroutput"><span class="identifier">fn</span></code> of a quoted metafunction. <code class="computeroutput"><span class="identifier">mp_invoke</span><span class="special"><</span><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</span><span class="special">>,</span> <span class="identifier">T</span><span class="special">...></span></code>
|
||||||
is an alias for <code class="computeroutput"><span class="identifier">F</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code>.
|
returns <code class="computeroutput"><span class="identifier">F</span><span class="special"><</span><span class="identifier">T</span><span class="special">...></span></code>.
|
||||||
<code class="computeroutput"><span class="identifier">mp_invoke</span><span class="special"><</span><span class="identifier">mp_quote</span><span class="special"><</span><span class="identifier">F</span><span class="special">,</span> <span class="identifier">T</span><span class="special">...>,</span> <span class="identifier">U</span><span class="special">...></span></code> is an alias for <code class="computeroutput"><span class="identifier">F</span><span class="special"><</span><span class="identifier">T</span><span class="special">...,</span> <span class="identifier">U</span><span class="special">...></span></code>.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1868,7 +1866,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
<td align="left"><p><small>Last revised: May 12, 2017 at 16:19:34 GMT</small></p></td>
|
<td align="left"><p><small>Last revised: May 12, 2017 at 16:42:29 GMT</small></p></td>
|
||||||
<td align="right"><div class="copyright-footer"></div></td>
|
<td align="right"><div class="copyright-footer"></div></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<hr>
|
<hr>
|
||||||
|
@@ -61,20 +61,19 @@ When `mp_valid<F, T...>` is `mp_true`, `mp_defer<F, T...>` is a struct with a ne
|
|||||||
`mp_defer<F, T...>` is an empty struct.
|
`mp_defer<F, T...>` is an empty struct.
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
[section `mp_quote<F, T...>`]
|
[section `mp_quote<F>`]
|
||||||
template<template<class...> class F, class... T> struct mp_quote
|
template<template<class...> class F> struct mp_quote
|
||||||
{
|
{
|
||||||
template<class... U> using fn = F<T..., U...>;
|
template<class... T> using fn = F<T...>;
|
||||||
};
|
};
|
||||||
|
|
||||||
`mp_quote<F, T...>` transforms the template `F` into a type. In the common case `mp_quote<F>`, the nested template `fn` of the result is an alias for `F`;
|
`mp_quote<F>` transforms the template `F` into a type with a nested template `fn` such that `fn<T...>` returns `F<T...>`.
|
||||||
otherwise, `fn<U...>` is an alias for `F<T..., U...>`, allowing partial application.
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
[section `mp_invoke<Q, T...>`]
|
[section `mp_invoke<Q, T...>`]
|
||||||
template<class Q, class... T> using mp_invoke = typename Q::template fn<T...>;
|
template<class Q, class... T> using mp_invoke = typename Q::template fn<T...>;
|
||||||
|
|
||||||
`mp_invoke<Q, T...>` evaluates the nested template `fn` of a quoted metafunction. `mp_invoke<mp_quote<F>, T...>` is an alias for `F<T...>`. `mp_invoke<mp_quote<F, T...>, U...>` is an alias for `F<T..., U...>`.
|
`mp_invoke<Q, T...>` evaluates the nested template `fn` of a quoted metafunction. `mp_invoke<mp_quote<F>, T...>` returns `F<T...>`.
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
@@ -106,21 +106,21 @@ struct mp_no_type
|
|||||||
template<template<class...> class F, class... T> using mp_defer = mp_if<mp_valid<F, T...>, detail::mp_defer_impl<F, T...>, detail::mp_no_type>;
|
template<template<class...> class F, class... T> using mp_defer = mp_if<mp_valid<F, T...>, detail::mp_defer_impl<F, T...>, detail::mp_no_type>;
|
||||||
|
|
||||||
// mp_quote
|
// mp_quote
|
||||||
template<template<class...> class F, class... T> struct mp_quote
|
template<template<class...> class F> struct mp_quote
|
||||||
{
|
{
|
||||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 && BOOST_MSVC >= 1900 )
|
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 && BOOST_MSVC >= 1900 )
|
||||||
#else
|
#else
|
||||||
private:
|
private:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template<class... U> struct _fn { using type = F<T..., U...>; };
|
template<class... T> struct _fn { using type = F<T...>; };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// the indirection through _fn works around the language inability
|
// the indirection through _fn works around the language inability
|
||||||
// to expand T... into a fixed parameter list of an alias template
|
// to expand T... into a fixed parameter list of an alias template
|
||||||
|
|
||||||
template<class... U> using fn = typename _fn<U...>::type;
|
template<class... T> using fn = typename _fn<T...>::type;
|
||||||
};
|
};
|
||||||
|
|
||||||
// mp_unquote
|
// mp_unquote
|
||||||
@@ -132,11 +132,6 @@ template<class Q, class... T> struct mp_invoke_impl
|
|||||||
using type = typename Q::template fn<T...>;
|
using type = typename Q::template fn<T...>;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<template<class...> class F, class... T, class... U> struct mp_invoke_impl<mp_quote<F, T...>, U...>
|
|
||||||
{
|
|
||||||
using type = F<T..., U...>;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
template<class Q, class... T> using mp_invoke = typename detail::mp_invoke_impl<Q, T...>::type;
|
template<class Q, class... T> using mp_invoke = typename detail::mp_invoke_impl<Q, T...>::type;
|
||||||
|
@@ -19,12 +19,9 @@ template<template<class...> class F, class... T> using Y = X<F<T>...>;
|
|||||||
|
|
||||||
template<class Q, class... T> using Z = X<mp_invoke<Q, T>...>;
|
template<class Q, class... T> using Z = X<mp_invoke<Q, T>...>;
|
||||||
|
|
||||||
struct B {};
|
template<class T, class U> struct P {};
|
||||||
struct D1: B {};
|
|
||||||
struct D2: B {};
|
|
||||||
struct ND {};
|
|
||||||
|
|
||||||
template<class T, class U> using is_base_of_t = typename std::is_base_of<T, U>::type;
|
template<class T, class U> using first = T;
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
@@ -38,19 +35,6 @@ int main()
|
|||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_invoke<Q, int[]>, int[]>));
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_invoke<Q, int[]>, int[]>));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
using Q = mp_quote<std::is_same, void>;
|
|
||||||
|
|
||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_invoke<Q, void>, std::is_same<void, void>>));
|
|
||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_invoke<Q, int[]>, std::is_same<void, int[]>>));
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
using Q = mp_quote<X, char[1], char[2], char[3]>;
|
|
||||||
|
|
||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_invoke<Q, int[1], int[2], int[3]>, X<char[1], char[2], char[3], int[1], int[2], int[3]>>));
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
using Q = mp_quote<mp_identity_t>;
|
using Q = mp_quote<mp_identity_t>;
|
||||||
|
|
||||||
@@ -68,19 +52,17 @@ int main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
using Q = mp_quote<is_base_of_t, B>;
|
using Q = mp_quote<P>;
|
||||||
|
|
||||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 )
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_invoke<Q, void, void>, P<void, void>>));
|
||||||
#else
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_invoke<Q, char[], int[]>, P<char[], int[]>>));
|
||||||
using R1 = Y<Q::fn, D1, D2, ND, int>;
|
}
|
||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<R1, X<std::true_type, std::true_type, std::false_type, std::false_type>>));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 && BOOST_MSVC >= 1900 )
|
{
|
||||||
#else
|
using Q = mp_quote<first>;
|
||||||
using R2 = Z<Q, D1, D2, ND, int>;
|
|
||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<R2, X<std::true_type, std::true_type, std::false_type, std::false_type>>));
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_invoke<Q, void, int>, void>));
|
||||||
#endif
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_invoke<Q, char[], int[]>, char[]>));
|
||||||
}
|
}
|
||||||
|
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
|
Reference in New Issue
Block a user