Безопасно ли сериализовать необработанное повышение :: variant?

StackOverflow https://stackoverflow.com/questions/1194842

Вопрос

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; Это делает работу для вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top