4

以下は、優れた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

4

0 に答える 0