원시 부스트 :: Variant를 직렬화하는 것이 안전합니까?
-
19-09-2019 - |
문제
부스트 :: 변형 값 유형이라고 주장합니다. 이것은 단순히 부스트 :: 변형의 원시 표현을 작성하고 포드 유형 만 포함하는 한 나중에 다시로드하는 것이 안전하다는 것을 의미합니까? 동일한 아키텍처에서 동일한 컴파일러와 동일한 버전의 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
, 물론 적절한 동기화를 가정합니다.
말할 것도없이, 당신이 말했듯이, 위는 변형에 POD 유형 만 포함 할 수있는 경우에만 유효합니다.
다른 팁
부스트/직렬화/variant.hpp를 포함하여 시도하십시오. 그것은 당신을 위해 일을합니다.
제휴하지 않습니다 StackOverflow