diff --git a/QuantLib.vcxproj b/QuantLib.vcxproj
index a9411df6f9..cc1dcb25fb 100644
--- a/QuantLib.vcxproj
+++ b/QuantLib.vcxproj
@@ -1874,6 +1874,7 @@
+
diff --git a/QuantLib.vcxproj.filters b/QuantLib.vcxproj.filters
index 632b1b9013..5d4fb18f3e 100644
--- a/QuantLib.vcxproj.filters
+++ b/QuantLib.vcxproj.filters
@@ -2286,6 +2286,9 @@
utilities
+
+ utilities
+
utilities
diff --git a/ql/CMakeLists.txt b/ql/CMakeLists.txt
index a45eb7f179..8a1db647df 100644
--- a/ql/CMakeLists.txt
+++ b/ql/CMakeLists.txt
@@ -2241,6 +2241,7 @@ set(QL_HEADERS
utilities/observablevalue.hpp
utilities/steppingiterator.hpp
utilities/tracing.hpp
+ utilities/variants.hpp
utilities/vectors.hpp
version.hpp
volatilitymodel.hpp
diff --git a/ql/quote.cpp b/ql/quote.cpp
index 2051b1fee7..c28cc8de13 100644
--- a/ql/quote.cpp
+++ b/ql/quote.cpp
@@ -20,20 +20,15 @@
#include
#include
#include
+#include
namespace QuantLib {
Handle handleFromVariant(const std::variant>& value) {
return std::visit(
- [](const auto& x) -> Handle {
- using T = std::decay_t;
- if constexpr (std::is_same_v) {
- return makeQuoteHandle(x);
- } else if constexpr (std::is_same_v>) {
- return x;
- } else {
- QL_FAIL("Unexpected type in quote variant");
- }
+ detail::variant_visitor{
+ [](Real x) -> Handle { return makeQuoteHandle(x); },
+ [](const Handle& x) { return x; }
},
value);
}
diff --git a/ql/utilities/Makefile.am b/ql/utilities/Makefile.am
index 628f6a2f2b..fdc8a4e38e 100644
--- a/ql/utilities/Makefile.am
+++ b/ql/utilities/Makefile.am
@@ -8,10 +8,11 @@ this_include_HEADERS = \
dataformatters.hpp \
dataparsers.hpp \
null.hpp \
- null_deleter.hpp \
+ null_deleter.hpp \
observablevalue.hpp \
steppingiterator.hpp \
tracing.hpp \
+ variants.hpp \
vectors.hpp
cpp_files = \
diff --git a/ql/utilities/all.hpp b/ql/utilities/all.hpp
index 13bb311609..51f8cb2ba6 100644
--- a/ql/utilities/all.hpp
+++ b/ql/utilities/all.hpp
@@ -9,5 +9,6 @@
#include
#include
#include
+#include
#include
diff --git a/ql/utilities/variants.hpp b/ql/utilities/variants.hpp
new file mode 100644
index 0000000000..d5f56ff3df
--- /dev/null
+++ b/ql/utilities/variants.hpp
@@ -0,0 +1,19 @@
+/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+#ifndef quantlib_utilities_variants_hpp
+#define quantlib_utilities_variants_hpp
+
+namespace QuantLib::detail {
+
+ // Helper type for use with std::visit.
+ template
+ struct variant_visitor : Ts... {
+ using Ts::operator()...;
+ };
+
+ template
+ variant_visitor(Ts...) -> variant_visitor;
+
+}
+
+#endif