28 template<
typename... Args>
29 struct pack<
std::variant<Args...>>
31 template<
typename Stream>
32 packer<Stream>& operator()(msgpack::packer<Stream>& o, std::variant<Args...>
const& v)
const
39 std::visit([&o](
auto&& arg) { o.pack(arg); }, v);
44 template<
typename... Args>
45 struct convert<
std::variant<Args...>>
50 template<
typename VariantType>
51 void set_variant_helper(std::size_t, msgpack::object
const&, VariantType&&)
const
72 template<
typename VariantType,
typename T,
typename... Types>
73 void set_variant_helper(std::size_t i, msgpack::object
const& o, VariantType&& v)
const
76 v = o.via.array.ptr[1].as<T>();
78 set_variant_helper<VariantType, Types...>(i - 1, o, v);
81 msgpack::object
const& operator()(msgpack::object
const& o, std::variant<Args...>& v)
const
83 if (o.type != msgpack::type::ARRAY)
84 throw msgpack::type_error();
88 if (o.via.array.size != 2)
89 throw msgpack::type_error();
90 std::size_t index = o.via.array.ptr[0].as<std::size_t>();
91 if (index >=
sizeof...(Args)) {
92 throw msgpack::type_error();
94 set_variant_helper<std::variant<Args...>&, Args...>(index, o, v);