From 514f3e8746c0854d6241013f6c531fd918645798 Mon Sep 17 00:00:00 2001 From: Mostafa Nanticock <47303284+MostafaNanticock@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:25:08 +0300 Subject: [PATCH 1/5] Add support for configurable monostate type Introduced variant_CONFIG_MONOSTATE that users can set its value if they want variant-lite to use it instead of its own monostate class --- include/nonstd/variant.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/nonstd/variant.hpp b/include/nonstd/variant.hpp index 89dc959..1497712 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 From 933c1747840b37c7d7932af6d2e403a1fae3dc2a Mon Sep 17 00:00:00 2001 From: Mostafa Nanticock <47303284+MostafaNanticock@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:26:55 +0300 Subject: [PATCH 2/5] Add support for configurable bad_variant_access type Introduced variant_CONFIG_BAD_VARIANT_ACCESS that users can set its value if they want variant-lite to use it instead of its own bad_variant_access class --- include/nonstd/variant.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/nonstd/variant.hpp b/include/nonstd/variant.hpp index 1497712..22e3ca8 100644 --- a/include/nonstd/variant.hpp +++ b/include/nonstd/variant.hpp @@ -1283,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: @@ -1295,6 +1298,7 @@ class variant_nodiscard bad_variant_access : public std::exception return "bad variant access"; } }; +#endif #endif // variant_CONFIG_NO_EXCEPTIONS From 5d833b4ad3d6b4a102336c50bf89f666ebcfdf89 Mon Sep 17 00:00:00 2001 From: Mostafa Nanticock <47303284+MostafaNanticock@users.noreply.github.com> Date: Tue, 23 Sep 2025 10:20:37 +0300 Subject: [PATCH 3/5] Update README.md synopsis: Configuration macros Added `variant_CONFIG_BAD_VARIANT_ACCESS` and `variant_CONFIG_MONOSTATE` to the Synopsis: Configuration macros section --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) 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. From ea832740fbbb4037dfc22c056997f198a93e0c55 Mon Sep 17 00:00:00 2001 From: Mostafa Nanticock <47303284+MostafaNanticock@users.noreply.github.com> Date: Wed, 24 Sep 2025 11:21:26 +0300 Subject: [PATCH 4/5] Updated template/variant.hpp --- template/variant.hpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/template/variant.hpp b/template/variant.hpp index 47c1665..bf238be 100644 --- a/template/variant.hpp +++ b/template/variant.hpp @@ -1087,16 +1087,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 // 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 From dcdde14a09292a2e2ade31831275a4fb211a7363 Mon Sep 17 00:00:00 2001 From: Mostafa Nanticock <47303284+MostafaNanticock@users.noreply.github.com> Date: Thu, 25 Sep 2025 01:40:12 +0300 Subject: [PATCH 5/5] Fixed: std::hash support with variant_CONFIG_MONOSTATE --- include/nonstd/variant.hpp | 4 ++-- template/variant.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/nonstd/variant.hpp b/include/nonstd/variant.hpp index 22e3ca8..7bc4756 100644 --- a/include/nonstd/variant.hpp +++ b/include/nonstd/variant.hpp @@ -2705,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 @@ -2753,7 +2753,7 @@ struct hash< nonstd::variant > } //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 )