std::monostate
in <utility>
std::monostate
is currently defined and available in the <variant>
header, but its utility is not limited to variant
s. We propose moving std::monostate
to <utility>
to reduce artificial coupling of std::monostate
clients to variants.
std::monostate
is a class that has exactly one value. It is default constructable and supports all the comparison operations. std::monostate
is about as simple of a type as one could concoct. These properties turn out to be useful for writing template code.
The first use case is in testing. Does your custom vector
or set
make any undesirable assumptions about the types they are instantiated with? If they work properly with std::monostate
, then probably not. std::monostate
can be used in this way as a means to write simple test drivers.
The second use case occurs in more sophisticated template metaprogramming. The well known std::future
class makes use of a "special" template parameter void
to indicate that it carries no information aside from when the future is fulfilled. Using the void
keyword to represent this situation carries a serious implementation burden due to its many strange properties. While this burden may not be a problem for standard library implementers, it would be nice to have a simpler option for the more common developer.
std::monostate
is a much more natural way to represent "no information" than void
is. It has exactly one value and is regular type instead of a keyword. Consider how simple the following code is:
template<typename ExtraInformation = std::monostate>
class Data
{
//...
ExtraInformation m_extraInformation;
}
Here we have a Data
template which optionally carries extra information. The use of std::monostate
in this example makes it simple in both specification and implementation to represent Data
objects that carry no additional information.
std::monostate
is a generally useful type and therefore belongs in a more appropriate header than <variant>
. If the committee deems this a worthy course of action, wording will be provided.