2009-07-28 3 views
6

boost::variant утверждает, что это тип значения. Означает ли это, что безопасно просто выписать необработанное представление boost :: variant и загрузить его позже, если оно содержит только типы POD? Предположим, что он будет перезагружен кодом, скомпилированным одним и тем же компилятором и той же версией boost, в той же архитектуре.Безопасно ли сериализовать исходный boost :: variant?

Кроме того, (возможно) эквивалентно, можно использовать :: вариант для использования в общей памяти?

+1

Выплескивание необработанного представления памяти, даже если это всего лишь структура POD, является плохой идеей и подвергает вас пощаде макета раскладки вашего компилятора, деталей архитектуры и суждения. – Thanatos

+0

В то время меня больше интересовало использование разделяемой памяти, в которой различия в макете не были проблемой вообще. – bdonlan

ответ

6

Что касается сериализации: он должен работать, да. Но почему вы не используете механизм посещений 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, при условии надлежащей синхронизации, конечно.

Излишне говорить, что, как вы сказали, вышесказанное допустимо только в том случае, если вариант может содержать только типы POD.

+0

Хотелось бы избежать написания большого количества кода шаблона, чтобы выписать указанные фактические типы :) – bdonlan

+0

не требуется код шаблона; см. выше –

14

Попробуйте включить форсирование/сериализацию/variant.hpp; это делает работу для вас.

+0

Работает ли это также не для типов POD? например std :: string – SeniorLee

+0

просмотр как boost :: variant был сделан для типов не POD (иначе вы могли бы использовать тегированный союз), я бы предположил, что да, но быстрый тест подтвердит. – spiderlama

Смежные вопросы