2009-07-28 43 views
6

boost::variant聲稱它是一個值類型。這是否意味着只要寫出boost :: variant的原始表示並稍後加載它是安全的,只要它只包含POD類型?假設它將由相同編譯器編譯的代碼重新加載,並在相同的體系結構上重新加載相同版本的boost。序列化原始boost :: variant是否安全?

此外,(可能)等價地,boost :: variant可以用於共享內存嗎?

+1

吐出原始內存表示,即使它只是一個POD結構,是一個糟糕的主意,並且讓你受到編譯器的填充佈局,體系結構細節和字節順序的擺佈。 – Thanatos 2010-08-06 02:23:59

+0

當時我更感興趣的是共享內存的使用情況,其中佈局差異根本不會成爲問題。 – bdonlan 2010-08-06 04:16:36

回答

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 2009-07-28 19:33:45

14

嘗試只包括boost/serialization/variant.hpp;它爲你做了工作。