Безопасно ли сериализовать необработанное повышение :: variant?
-
19-09-2019 - |
Вопрос
Boost :: Вариант утверждает, что это тип значения. Означает ли это, что безопасно просто написать необработанное представление о варианте Boost :: и загрузить его позже, если оно содержит только типы стручков? Предположим, что он будет перезагружен кодом, скомпилированным одним и тем же компилятором, и той же версией Boost, на той же архитектуре.
Кроме того, (вероятно) эквивалентно, можно ли использовать вариант :: Вариант использовать в общей памяти?
Решение
Что касается сериализации: это должно работать, да. Но почему бы вам не использовать boost::variant
Механизм посещения, чтобы написать фактический тип, содержащийся в варианте?
struct variant_serializer : boost::static_visitor<void> {
template <typename T>
typename boost::enable_if< boost::is_pod<T>, void>::type
operator()( const T & t ) const {
// ... serialize here, e.g.
std::cout << t;
}
};
int main() {
const boost::variant<int,char,float,double> v( '1' );
variant_serializer s;
boost::apply_visitor( s, v );
return 0;
}
Относительно общей памяти: boost::variant
не выполняет распределения кучи, поэтому вы можете поместить ее в общую память, как int
, предполагая правильную синхронизацию, конечно.
Само собой разумеется, как вы сказали, вышеупомянутое действительное только в том случае, если вариант может содержать только типы стручков.
Другие советы
Попробуйте просто включить Boost/serialization/variant.hpp; Это делает работу для вас.