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 )