下面是一个使用强大的Boost.Serialization库的最小示例。
要编译库,我需要链接boost_serialization
预编译的库。
$ c++ -std=c++11 example.cpp -o example.x -lboost_serialization
^^^^^^^^^^^^^^^^^^^^^
该库被大量模板化,虽然内部复杂,但实际代码(函数体)非常简单。只有少数引用需要链接,即:
boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::text_oarchive_impl(std::ostream&, unsigned int)
boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::text_iarchive_impl(std::istream&, unsigned int)
boost::archive::text_iarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()
boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::~text_iarchive_impl()
...
boost::archive::archive_exception::~archive_exception()'
是否有机会在不链接为仅标头库的情况下使用该库?
例如一些未记录的技巧或黑客行为?
这将使其在一些超级计算机集群和环境中使用起来更加简单,而这些环境并不是那么简单地编译 Boost。
#include<sstream>
#include<numeric>
#include<boost/archive/text_oarchive.hpp> // needs linking
#include<boost/archive/text_iarchive.hpp>
#include<boost/serialization/vector.hpp>
int main(){
std::vector<double> v(10); std::iota(v.begin(), v.end(), 0);
std::stringstream ss;
{
boost::archive::text_oarchive toa(ss);
toa << v;
}
std::vector<double> v2;
boost::archive::text_iarchive tia(ss);
tia >> v2;
assert(v == v2);
}
编辑:如果图书馆只提供标题选项,我会非常酷,就像 Boost.Asio 一样(https://stackoverflow.com/a/40729439/225186。)
EDIT2:Boost.Serialization 的作者和维护者拒绝了仅将其设为标题的想法。https://github.com/boostorg/serialization/issues/71