OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
variant_overloaded.hpp
Go to the documentation of this file.
1// Copyright (c) 2021 MIT Digital Currency Initiative,
2// Federal Reserve Bank of Boston
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef OPENCBDC_TX_SRC_COMMON_VARIANT_OVERLOADED_H_
7#define OPENCBDC_TX_SRC_COMMON_VARIANT_OVERLOADED_H_
8
9#include <array>
10#include <cassert>
11#include <cstddef>
12#include <variant>
13
14namespace cbdc {
31 template<class... Ts>
32 struct overloaded : Ts... {
33 using Ts::operator()...;
34 };
35
36 template<class... Ts>
37 overloaded(Ts...) -> overloaded<Ts...>;
38
47 template<typename... Ts>
48 [[nodiscard]] auto expand_type(size_t i) -> std::variant<Ts...> {
49 static_assert((std::is_default_constructible_v<Ts> && ...));
50 using T = typename std::variant<Ts...>;
51 assert(i < std::variant_size_v<T>);
52 static constexpr auto t = std::array{+[]() {
53 return T{Ts{}};
54 }...};
55 // TODO: deserialization error handling for variant indexes.
56 return t.at(i)();
57 }
58}
59
60#endif // OPENCBDC_TX_SRC_COMMON_VARIANT_OVERLOADED_H_
overloaded(Ts...) -> overloaded< Ts... >
auto expand_type(size_t i) -> std::variant< Ts... >
Default-constructs a std::variant from a template parameter pack.
Variant handler template.