forked from boostorg/mp11
Fix tuple_cat example a bit
This commit is contained in:
@@ -474,7 +474,7 @@
|
|||||||
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="identifier">t1</span><span class="special">{</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span> <span class="special">};</span>
|
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="identifier">t1</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="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">float</span><span class="special">,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">t2</span><span class="special">{</span> <span class="number">3.0f</span><span class="special">,</span> <span class="number">4.0f</span><span class="special">,</span> <span class="number">5.0f</span> <span class="special">};</span>
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">float</span><span class="special">,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">t2</span><span class="special">{</span> <span class="number">3.0f</span><span class="special">,</span> <span class="number">4.0f</span><span class="special">,</span> <span class="number">5.0f</span> <span class="special">};</span>
|
||||||
|
|
||||||
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">::</span><span class="identifier">tuple_cat</span><span class="special">(</span> <span class="identifier">t1</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span> <span class="identifier">t2</span> <span class="special">)</span> <span class="special">);</span>
|
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">::</span><span class="identifier">tuple_cat</span><span class="special">(</span> <span class="identifier">t1</span><span class="special">,</span> <span class="identifier">t2</span> <span class="special">);</span>
|
||||||
</pre>
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
Let's fix these one by one. Support for move-only types is easy, if one knows
|
Let's fix these one by one. Support for move-only types is easy, if one knows
|
||||||
@@ -542,11 +542,11 @@
|
|||||||
<p>
|
<p>
|
||||||
What we need is, given a tuple-like type <code class="computeroutput"><span class="identifier">Tp</span></code>,
|
What we need is, given a tuple-like type <code class="computeroutput"><span class="identifier">Tp</span></code>,
|
||||||
to obtain <code class="computeroutput"><span class="identifier">mp_list</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element</span><span class="special"><</span><span class="number">0</span><span class="special">,</span>
|
to obtain <code class="computeroutput"><span class="identifier">mp_list</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element</span><span class="special"><</span><span class="number">0</span><span class="special">,</span>
|
||||||
<span class="identifier">Tp</span><span class="special">>,</span>
|
<span class="identifier">Tp</span><span class="special">>::</span><span class="identifier">type</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element</span><span class="special"><</span><span class="number">1</span><span class="special">,</span>
|
||||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element</span><span class="special"><</span><span class="number">1</span><span class="special">,</span> <span class="identifier">Tp</span><span class="special">>,</span> <span class="special">...,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element</span><span class="special"><</span><span class="identifier">N</span><span class="special">-</span><span class="number">1</span><span class="special">,</span> <span class="identifier">Tp</span><span class="special">>></span></code>, where <code class="computeroutput"><span class="identifier">N</span></code>
|
<span class="identifier">Tp</span><span class="special">>::</span><span class="identifier">type</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element</span><span class="special"><</span><span class="identifier">N</span><span class="special">-</span><span class="number">1</span><span class="special">,</span> <span class="identifier">Tp</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span></code>, where <code class="computeroutput"><span class="identifier">N</span></code>
|
||||||
is <code class="computeroutput"><span class="identifier">tuple_size</span><span class="special"><</span><span class="identifier">Tp</span><span class="special">>::</span><span class="identifier">value</span></code>. Here's one way to do it:
|
is <code class="computeroutput"><span class="identifier">tuple_size</span><span class="special"><</span><span class="identifier">Tp</span><span class="special">>::</span><span class="identifier">value</span></code>. Here's one way to do it:
|
||||||
</p>
|
</p>
|
||||||
<pre class="programlisting"><span class="keyword">template</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">I</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">tuple_element</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element_t</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="identifier">T</span><span class="special">>;</span>
|
<pre class="programlisting"><span class="keyword">template</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">I</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">tuple_element</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element</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="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">;</span>
|
||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">from_tuple_like</span> <span class="special">=</span> <span class="identifier">mp_product</span><span class="special"><</span><span class="identifier">tuple_element</span><span class="special">,</span> <span class="identifier">mp_list</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="identifier">mp_iota</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_size</span><span class="special"><</span><span class="identifier">T</span><span class="special">>>>;</span>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">from_tuple_like</span> <span class="special">=</span> <span class="identifier">mp_product</span><span class="special"><</span><span class="identifier">tuple_element</span><span class="special">,</span> <span class="identifier">mp_list</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="identifier">mp_iota</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_size</span><span class="special"><</span><span class="identifier">T</span><span class="special">>>>;</span>
|
||||||
</pre>
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
@@ -591,7 +591,7 @@
|
|||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">remove_cv_ref</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">remove_cv</span><span class="special"><</span>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">remove_cv_ref</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">remove_cv</span><span class="special"><</span>
|
||||||
<span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">>::</span><span class="identifier">type</span><span class="special">;</span>
|
<span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">>::</span><span class="identifier">type</span><span class="special">;</span>
|
||||||
|
|
||||||
<span class="keyword">template</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">I</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">tuple_element</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element_t</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="identifier">T</span><span class="special">>;</span>
|
<span class="keyword">template</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">I</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">tuple_element</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_element</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="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">;</span>
|
||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">from_tuple_like</span> <span class="special">=</span> <span class="identifier">mp_product</span><span class="special"><</span><span class="identifier">tuple_element</span><span class="special">,</span> <span class="identifier">mp_list</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="identifier">mp_iota</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_size</span><span class="special"><</span><span class="identifier">T</span><span class="special">>>>;</span>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">using</span> <span class="identifier">from_tuple_like</span> <span class="special">=</span> <span class="identifier">mp_product</span><span class="special"><</span><span class="identifier">tuple_element</span><span class="special">,</span> <span class="identifier">mp_list</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="identifier">mp_iota</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple_size</span><span class="special"><</span><span class="identifier">T</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">Tp</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">Tp</span><span class="special">,</span>
|
||||||
@@ -2317,7 +2317,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 18, 2017 at 11:57:59 GMT</small></p></td>
|
<td align="left"><p><small>Last revised: May 18, 2017 at 22:41:31 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>
|
||||||
|
@@ -148,7 +148,7 @@ that support `tuple_size`, `tuple_element`, and `get`), while our implementation
|
|||||||
std::array<int, 2> t1{ 1, 2 };
|
std::array<int, 2> t1{ 1, 2 };
|
||||||
std::array<float, 3> t2{ 3.0f, 4.0f, 5.0f };
|
std::array<float, 3> t2{ 3.0f, 4.0f, 5.0f };
|
||||||
|
|
||||||
auto result = ::tuple_cat( t1, std::move( t2 ) );
|
auto result = ::tuple_cat( t1, t2 );
|
||||||
|
|
||||||
Let's fix these one by one. Support for move-only types is easy, if one knows where to look. The problem is
|
Let's fix these one by one. Support for move-only types is easy, if one knows where to look. The problem is
|
||||||
that `Tp` that we're passing to the helper `tuple_cat_` is (correctly) `tuple<unique_ptr<int>&&, unique_ptr<float>&&>`,
|
that `Tp` that we're passing to the helper `tuple_cat_` is (correctly) `tuple<unique_ptr<int>&&, unique_ptr<float>&&>`,
|
||||||
@@ -193,10 +193,10 @@ the corresponding `mp_list`.
|
|||||||
Technically, a more principled approach would've been to return `std::tuple`, but here `mp_list` will prove more
|
Technically, a more principled approach would've been to return `std::tuple`, but here `mp_list` will prove more
|
||||||
convenient.
|
convenient.
|
||||||
|
|
||||||
What we need is, given a tuple-like type `Tp`, to obtain `mp_list<std::tuple_element<0, Tp>, std::tuple_element<1, Tp>,
|
What we need is, given a tuple-like type `Tp`, to obtain `mp_list<std::tuple_element<0, Tp>::type, std::tuple_element<1, Tp>::type,
|
||||||
..., std::tuple_element<N-1, Tp>>`, where `N` is `tuple_size<Tp>::value`. Here's one way to do it:
|
..., std::tuple_element<N-1, Tp>::type>`, where `N` is `tuple_size<Tp>::value`. Here's one way to do it:
|
||||||
|
|
||||||
template<class T, class I> using tuple_element = std::tuple_element_t<I::value, T>;
|
template<class T, class I> using tuple_element = typename std::tuple_element<I::value, T>::type;
|
||||||
template<class T> using from_tuple_like = mp_product<tuple_element, mp_list<T>, mp_iota<std::tuple_size<T>>>;
|
template<class T> using from_tuple_like = mp_product<tuple_element, mp_list<T>, mp_iota<std::tuple_size<T>>>;
|
||||||
|
|
||||||
(`mp_iota<N>` is an algorithm that returns an `mp_list` with elements `mp_size_t<0>`, `mp_size_t<1>`, ..., `mp_size_t<N-1>`.)
|
(`mp_iota<N>` is an algorithm that returns an `mp_list` with elements `mp_size_t<0>`, `mp_size_t<1>`, ..., `mp_size_t<N-1>`.)
|
||||||
@@ -224,7 +224,7 @@ With all these fixes applied, our fully operational `tuple_cat` now looks like t
|
|||||||
template<class T> using remove_cv_ref = typename std::remove_cv<
|
template<class T> using remove_cv_ref = typename std::remove_cv<
|
||||||
typename std::remove_reference<T>::type>::type;
|
typename std::remove_reference<T>::type>::type;
|
||||||
|
|
||||||
template<class T, class I> using tuple_element = std::tuple_element_t<I::value, T>;
|
template<class T, class I> using tuple_element = typename std::tuple_element<I::value, T>::type;
|
||||||
template<class T> using from_tuple_like = mp_product<tuple_element, mp_list<T>, mp_iota<std::tuple_size<T>>>;
|
template<class T> using from_tuple_like = mp_product<tuple_element, mp_list<T>, mp_iota<std::tuple_size<T>>>;
|
||||||
|
|
||||||
template<class... Tp,
|
template<class... Tp,
|
||||||
|
Reference in New Issue
Block a user