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