Add an implementation of std::variant #48
+2,999
−30
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR adds Michael Park's variant implementation, and uses it in common_iterator (unless we're compiling with C++17, in which case std::variant is used).
This shrinks common_iterator a little, but at the cost of potentially worse codegen for various functions: in particular, operator==() gets routed through std::visit, which may not optimise all that well.
There's also the fact that MPark.Variant is absolutely huge -- at around 3kloc, it's about 20% the size of the whole of NanoRange at present. If it were just for common_iterator, I probably wouldn't bother; but we may be able to reuse it to implement
semiregular
, and thus avoid having to drag in an equally-large optional implementation from somewhere.