是否可以将Boost序列化用作仅头文件库?

时间:2017-06-07 06:08:01

标签: c++ boost boost-serialization header-only

以下是使用优秀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

0 个答案:

没有答案