Skip to content

Commit b0ab8e3

Browse files
committed
Make unexpected types in quote variant a compile-time error
Simplify usage of std::visit using a helper visitor type as shown in https://en.cppreference.com/w/cpp/utility/variant/visit2 This also catches unknown types at compile-time instead of run-time even on older compilers.
1 parent 46a3903 commit b0ab8e3

File tree

7 files changed

+31
-10
lines changed

7 files changed

+31
-10
lines changed

QuantLib.vcxproj

+1
Original file line numberDiff line numberDiff line change
@@ -1874,6 +1874,7 @@
18741874
<ClInclude Include="ql\utilities\observablevalue.hpp" />
18751875
<ClInclude Include="ql\utilities\steppingiterator.hpp" />
18761876
<ClInclude Include="ql\utilities\tracing.hpp" />
1877+
<ClInclude Include="ql\utilities\variants.hpp" />
18771878
<ClInclude Include="ql\utilities\vectors.hpp" />
18781879
<ClInclude Include="ql\any.hpp" />
18791880
<ClInclude Include="ql\auto_link.hpp" />

QuantLib.vcxproj.filters

+3
Original file line numberDiff line numberDiff line change
@@ -2286,6 +2286,9 @@
22862286
<ClInclude Include="ql\utilities\tracing.hpp">
22872287
<Filter>utilities</Filter>
22882288
</ClInclude>
2289+
<ClInclude Include="ql\utilities\variants.hpp">
2290+
<Filter>utilities</Filter>
2291+
</ClInclude>
22892292
<ClInclude Include="ql\utilities\vectors.hpp">
22902293
<Filter>utilities</Filter>
22912294
</ClInclude>

ql/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -2241,6 +2241,7 @@ set(QL_HEADERS
22412241
utilities/observablevalue.hpp
22422242
utilities/steppingiterator.hpp
22432243
utilities/tracing.hpp
2244+
utilities/variants.hpp
22442245
utilities/vectors.hpp
22452246
version.hpp
22462247
volatilitymodel.hpp

ql/quote.cpp

+4-9
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,15 @@
2020
#include <ql/quote.hpp>
2121
#include <ql/quotes/simplequote.hpp>
2222
#include <ql/errors.hpp>
23+
#include <ql/utilities/variants.hpp>
2324

2425
namespace QuantLib {
2526

2627
Handle<Quote> handleFromVariant(const std::variant<Real, Handle<Quote>>& value) {
2728
return std::visit(
28-
[](const auto& x) -> Handle<Quote> {
29-
using T = std::decay_t<decltype(x)>;
30-
if constexpr (std::is_same_v<T, Real>) {
31-
return makeQuoteHandle(x);
32-
} else if constexpr (std::is_same_v<T, Handle<Quote>>) {
33-
return x;
34-
} else {
35-
QL_FAIL("Unexpected type in quote variant");
36-
}
29+
detail::variant_visitor{
30+
[](Real x) -> Handle<Quote> { return makeQuoteHandle(x); },
31+
[](const Handle<Quote>& x) { return x; }
3732
},
3833
value);
3934
}

ql/utilities/Makefile.am

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ this_include_HEADERS = \
88
dataformatters.hpp \
99
dataparsers.hpp \
1010
null.hpp \
11-
null_deleter.hpp \
11+
null_deleter.hpp \
1212
observablevalue.hpp \
1313
steppingiterator.hpp \
1414
tracing.hpp \
15+
variants.hpp \
1516
vectors.hpp
1617

1718
cpp_files = \

ql/utilities/all.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
#include <ql/utilities/observablevalue.hpp>
1010
#include <ql/utilities/steppingiterator.hpp>
1111
#include <ql/utilities/tracing.hpp>
12+
#include <ql/utilities/variants.hpp>
1213
#include <ql/utilities/vectors.hpp>
1314

ql/utilities/variants.hpp

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2+
3+
#ifndef quantlib_utilities_variants_hpp
4+
#define quantlib_utilities_variants_hpp
5+
6+
namespace QuantLib::detail {
7+
8+
// Helper type for use with std::visit.
9+
template <class... Ts>
10+
struct variant_visitor : Ts... {
11+
using Ts::operator()...;
12+
};
13+
14+
template <class... Ts>
15+
variant_visitor(Ts...) -> variant_visitor<Ts...>;
16+
17+
}
18+
19+
#endif

0 commit comments

Comments
 (0)