<div dir="ltr">Sir,<div>I gave the following includes</div><div><div>#include &lt;boost/serialization/array.hpp&gt;</div><div>#include &lt;boost/array.hpp&gt;</div></div><div><br></div><div>I know boost::array exists,but does boost::serialization::array exist?Because in the namespace serialization in the boost/serialization/array.hpp, I could not find such a template.</div><div><br></div><div><div>namespace boost { namespace serialization {</div><div><br></div><div>// traits to specify whether to use  an optimized array serialization</div><div><br></div><div>template &lt;class Archive&gt;</div><div>struct use_array_optimization : boost::mpl::always&lt;boost::mpl::false_&gt; {};</div><div><br></div><div>template&lt;class T&gt;</div><div>class array_wrapper :</div><div>    public wrapper_traits&lt;const array_wrapper&lt; T &gt; &gt;</div><div>{</div><div>private:</div><div>    array_wrapper &amp; operator=(const array_wrapper &amp; rhs);</div><div>public:</div><div>    // note: I would like to make the copy constructor private but this breaks</div><div>    // make_array.  So I try to make make_array a friend - but that doesn&#39;t</div><div>    // build.  Need a C++ guru to explain this!</div><div>    template&lt;class S&gt;</div><div>    friend const boost::serialization::array_wrapper&lt;T&gt; make_array( T* t, S s);</div><div><br></div><div>    array_wrapper(const array_wrapper &amp; rhs) :</div><div>        m_t(rhs.m_t),</div><div>        m_element_count(rhs.m_element_count)</div><div>    {}</div><div>public:</div><div>    array_wrapper(T * t, std::size_t s) :</div><div>        m_t(t),</div><div>        m_element_count(s)</div><div>    {}</div><div><br></div><div>    // default implementation</div><div>    template&lt;class Archive&gt;</div><div>    void serialize_optimized(Archive &amp;ar, const unsigned int, mpl::false_ ) const</div><div>    {</div><div>      // default implemention does the loop</div><div>      std::size_t c = count();</div><div>      T * t = address();</div><div>      while(0 &lt; c--)</div><div>            ar &amp; boost::serialization::make_nvp(&quot;item&quot;, *t++);</div><div>    }</div><div><br></div><div>    // optimized implementation</div><div>    template&lt;class Archive&gt;</div><div>    void serialize_optimized(Archive &amp;ar, const unsigned int version, mpl::true_ )</div><div>    {</div><div>      boost::serialization::split_member(ar, *this, version);</div><div>    }</div><div><br></div><div>    // default implementation</div><div>    template&lt;class Archive&gt;</div><div>    void save(Archive &amp;ar, const unsigned int version) const</div><div>    {</div><div>      ar.save_array(*this,version);</div><div>    }</div><div><br></div><div>    // default implementation</div><div>    template&lt;class Archive&gt;</div><div>    void load(Archive &amp;ar, const unsigned int version)</div><div>    {</div><div>      ar.load_array(*this,version);</div><div>    }</div><div>    </div><div>    // default implementation</div><div>    template&lt;class Archive&gt;</div><div>    void serialize(Archive &amp;ar, const unsigned int version)</div><div>    {</div><div>      typedef typename </div><div>          boost::serialization::use_array_optimization&lt;Archive&gt;::template apply&lt;</div><div>                    typename remove_const&lt; T &gt;::type </div><div>                &gt;::type use_optimized;</div><div>      serialize_optimized(ar,version,use_optimized());</div><div>    }</div><div>    </div><div>    T * address() const</div><div>    {</div><div>      return m_t;</div><div>    }</div><div><br></div><div>    std::size_t count() const</div><div>    {</div><div>      return m_element_count;</div><div>    }</div><div><br></div><div>private:</div><div>    T * const m_t;</div><div>    const std::size_t m_element_count;</div><div>};</div><div><br></div><div>template&lt;class T, class S&gt;</div><div>inline</div><div>const array_wrapper&lt; T &gt; make_array( T* t, S s){</div><div>    const array_wrapper&lt; T &gt; a(t, s);</div><div>    return a;</div><div>}</div><div><br></div><div>} } // end namespace boost::serialization</div><div><br></div><div>// I can&#39;t figure out why BOOST_NO_CXX11_HDR_ARRAY</div><div>// has been set for clang-11.  So just make sure</div><div>// it&#39;s reset now.  Needs further research!!!</div><div><br></div><div>#if defined(_LIBCPP_VERSION)</div><div>#undef BOOST_NO_CXX11_HDR_ARRAY</div><div>#endif</div><div><br></div><div>#ifndef BOOST_NO_CXX11_HDR_ARRAY</div><div>#include &lt;array&gt;</div><div>namespace boost { namespace serialization {</div><div>// implement serialization for std::array</div><div>template &lt;class Archive, class T, std::size_t N&gt;</div><div>void serialize(Archive&amp; ar, std::array&lt;T,N&gt;&amp; a, const unsigned int /* version */)</div><div>{</div><div>    ar &amp; boost::serialization::make_nvp(</div><div>        &quot;elems&quot;,</div><div>        *static_cast&lt;T (*)[N]&gt;(static_cast&lt;void *&gt;(a.data()))</div><div>    );</div><div>    </div><div>}</div><div>} } // end namespace boost::serialization</div><div>#endif</div></div></div>

