diff --git a/README.md b/README.md
index 8386ae5..de85509 100644
--- a/README.md
+++ b/README.md
@@ -248,6 +248,32 @@ Define this to the pod-type you want to align to (no default).
\-Dvariant\_CONFIG\_ALIGN\_AS\_FALLBACK=*pod_type*
Define this to the pod-type to use for alignment if the algorithm of *variant lite* cannot find a suitable POD type to use for alignment. Default is `double`.
+#### Override `bad_variant_access`
+variant_CONFIG_BAD_VARIANT_ACCESS=type
+
+Define this macro to override the default definition of `bad_variant_access`.
+
+This is useful when integrating with other compatibility libraries or the standard library to avoid conflicting exception types.
+
+Example:
+```cpp
+#define variant_CONFIG_BAD_VARIANT_ACCESS std::bad_variant_access
+```
+If not defined, variant-lite uses its own `nonstd::bad_variant_access`.
+
+#### Override `monostate`
+variant_CONFIG_MONOSTATE=type
+
+Define this macro to override the default `monostate` type used by variant-lite.
+
+This helps prevent type conflicts when multiple libraries define their own monostate.
+
+Example:
+```cpp
+#define variant_CONFIG_MONOSTATE std::monostate
+```
+If not defined, variant-lite uses its own `nonstd::monostate`.
+
## Reported to work with
The table below mentions the compiler versions *variant lite* is reported to work with.
diff --git a/include/nonstd/variant.hpp b/include/nonstd/variant.hpp
index 89dc959..7bc4756 100644
--- a/include/nonstd/variant.hpp
+++ b/include/nonstd/variant.hpp
@@ -1212,16 +1212,19 @@ class variant;
// 19.7.8 Class monostate
+#ifdef variant_CONFIG_MONOSTATE
+using variant_CONFIG_MONOSTATE;
+#else
class monostate{};
// 19.7.9 monostate relational operators
-
inline variant_constexpr bool operator< ( monostate, monostate ) variant_noexcept { return false; }
inline variant_constexpr bool operator> ( monostate, monostate ) variant_noexcept { return false; }
inline variant_constexpr bool operator<=( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator>=( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator==( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator!=( monostate, monostate ) variant_noexcept { return false; }
+#endif
// 19.7.4 variant helper classes
@@ -1280,6 +1283,9 @@ static const std::size_t variant_npos = static_cast( -1 );
// 19.7.11 Class bad_variant_access
+#ifdef variant_CONFIG_BAD_VARIANT_ACCESS
+using variant_CONFIG_BAD_VARIANT_ACCESS;
+#else
class variant_nodiscard bad_variant_access : public std::exception
{
public:
@@ -1292,6 +1298,7 @@ class variant_nodiscard bad_variant_access : public std::exception
return "bad variant access";
}
};
+#endif
#endif // variant_CONFIG_NO_EXCEPTIONS
@@ -2698,7 +2705,7 @@ using namespace variants;
} // namespace nonstd
-#if variant_CPP11_OR_GREATER
+#if ! defined (variant_CONFIG_MONOSTATE) && variant_CPP11_OR_GREATER
// 19.7.12 Hash support
@@ -2746,7 +2753,7 @@ struct hash< nonstd::variant ( monostate, monostate ) variant_noexcept { return false; }
inline variant_constexpr bool operator<=( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator>=( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator==( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator!=( monostate, monostate ) variant_noexcept { return false; }
+#endif // variant_CONFIG_MONOSTATE
// 19.7.4 variant helper classes
@@ -1155,6 +1158,9 @@ static const std::size_t variant_npos = static_cast( -1 );
// 19.7.11 Class bad_variant_access
+#ifdef variant_CONFIG_BAD_VARIANT_ACCESS
+using variant_CONFIG_BAD_VARIANT_ACCESS;
+#else
class variant_nodiscard bad_variant_access : public std::exception
{
public:
@@ -1167,6 +1173,7 @@ class variant_nodiscard bad_variant_access : public std::exception
return "bad variant access";
}
};
+#endif // variant_CONFIG_BAD_VARIANT_ACCESS
#endif // variant_CONFIG_NO_EXCEPTIONS
@@ -2043,7 +2050,7 @@ using namespace variants;
} // namespace nonstd
-#if variant_CPP11_OR_GREATER
+#if ! defined (variant_CONFIG_MONOSTATE) && variant_CPP11_OR_GREATER
// 19.7.12 Hash support
@@ -2077,7 +2084,7 @@ struct hash< nonstd::variant<{{TplArgsList}}> >
} //namespace std
-#endif // variant_CPP11_OR_GREATER
+#endif // ! defined (variant_CONFIG_MONOSTATE) && variant_CPP11_OR_GREATER
#if variant_BETWEEN( variant_COMPILER_MSVC_VER, 1300, 1900 )
# pragma warning( pop )