This repository contains a never-valueless C++11/14/17 implementation of
std::variant in
variant.hpp and an implementation of
expected<T, E...>
in expected.hpp
that is an extended version of expected<T, E>
as proposed in
P0323R1
and the subsequent
D0323R2.
The code requires Boost.Mp11 and Boost.Config.
The repository is intended to be placed into the libs/variant2
directory of
a Boost clone or release, but the header variant.hpp
will also work
standalone.
Supported compilers:
- g++ 4.8 or later with
-std=c++11
or above - clang++ 3.5 or later with
-std=c++11
or above - Visual Studio 2015, 2017
Tested on Travis and Appveyor.
The class boost::variant2::variant<T...>
is an almost conforming
implementation of std::variant
with the following differences:
- A converting constructor from, e.g.
variant<int, float>
tovariant<float, double, int>
is provided as an extension; - The reverse operation, going from
variant<float, double, int>
tovariant<int, float>
is provided as the member functionsubset<U...>
. (This operation can throw if the current state of the variant cannot be represented.) variant<T...>
is not trivial when all contained types are trivial.
To avoid going into a valueless-by-exception state, this implementation falls back to using double storage unless
- one of the alternatives is the type
monostate
, - one of the alternatives has a nonthrowing default constructor, or
- all the contained types are nothrow move constructible.
If the first two bullets don't hold, but the third does, the variant uses
single storage, but emplace
constructs a temporary and moves it into place
if the construction of the object can throw. In case this is undesirable, one
can force emplace
into always constructing in-place by adding monostate
as
one of the alternatives.
The class boost::variant2::expected<T, E...>
represents the return type of
an operation that may potentially fail. It contains either the expected result
of type T
, or a reason for the failure, of one of the error types in E...
.
Internally, this is stored as variant<T, E...>
.
See its documentation for more information.
Note that, while variant
is production quality, expected
is still a work
in progress and has no test suite yet.