From 742980e5331bc0225ef738f5b34c0bb7b77a736d Mon Sep 17 00:00:00 2001 From: slymz Date: Wed, 6 May 2020 18:27:35 -0400 Subject: [PATCH] for std::decay fix, anchor and cross-reference tuple-cat fix more accurately --- doc/mp11/examples.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/mp11/examples.adoc b/doc/mp11/examples.adoc index 61dac8a..314a9ff 100644 --- a/doc/mp11/examples.adoc +++ b/doc/mp11/examples.adoc @@ -264,6 +264,7 @@ Long story short, we need `std::move(tp)` in `tuple_cat_` to make `tp` an rvalue return R{ std::get(std::get(std::move(tp)))... }; } +[[fixing-tuple-cat-const-issue]] Next, `const`-qualified tuples. The issue here is that we're stripping references from the input tuples, but not `const`. As a result, we're trying to manipulate types such as `tuple const` with Mp11 algorithms, and these types do not fit the list concept. We just need to strip qualifiers as well, by defining the useful `remove_cv_ref` @@ -424,7 +425,7 @@ With `Qret` in hand, a `variant` of the possible return types is just a matter o Why does this work? `mp_product, L2, ..., Ln>` returns `L1, ...>`, where `Ui` traverse all possible combinations of list values. Since in our case all `Li` are `std::variant`, the result will also be `std::variant`. (`mp_product_q` is the same as `mp_product`, but for quoted metafunctions such as our `Qret` or `Qret_F`.) We needed to use `std::decay_t` for precisely the -same reason as in the link:#fixing-tuple_cat[Fixing tuple_cat example], where `std::decay_t` is an equivalent alternative to `remove_cv_ref`. +same reason as in the <>, where `std::decay_t` is an equivalent alternative to `remove_cv_ref`. One more step remains. Suppose that, as above, we're passing two variants of type `std::variant` and `F` is