mirror of
https://github.com/USCiLab/cereal.git
synced 2025-10-18 01:45:52 +02:00
Use std::variant::emplace when loading
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user