Use std::variant::emplace when loading

This commit is contained in:
logan
2021-06-10 11:15:00 -07:00
committed by Shane Grant
parent 46a4a91007
commit 0bbbb142f9

View File

@@ -54,25 +54,24 @@ namespace cereal
};
//! @internal
template<int N, class Variant, class ... Args, class Archive>
template<int N, class Variant, class Archive>
typename std::enable_if<N == std::variant_size_v<Variant>, void>::type
load_variant(Archive & /*ar*/, int /*target*/, Variant & /*variant*/)
{
throw ::cereal::Exception("Error traversing variant during load");
}
//! @internal
template<int N, class Variant, class H, class ... T, class Archive>
template<int N, class Variant, class Archive>
typename std::enable_if<N < std::variant_size_v<Variant>, void>::type
load_variant(Archive & ar, int target, Variant & variant)
{
if(N == target)
{
H value;
ar( CEREAL_NVP_("data", value) );
variant = std::move(value);
variant.template emplace<N>();
ar( CEREAL_NVP_("data", std::get<N>(variant)) );
}
else
load_variant<N+1, Variant, T...>(ar, target, variant);
load_variant<N+1>(ar, target, variant);
}
} // namespace variant_detail
@@ -98,7 +97,7 @@ namespace cereal
if(index >= static_cast<std::int32_t>(std::variant_size_v<variant_t>))
throw Exception("Invalid 'index' selector when deserializing std::variant");
variant_detail::load_variant<0, variant_t, VariantTypes...>(ar, index, variant);
variant_detail::load_variant<0>(ar, index, variant);
}
//! Serializing a std::monostate