Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使存档成为解析指针?_C++_Boost_Boost Serialization - Fatal编程技术网

C++ 如何使存档成为解析指针?

C++ 如何使存档成为解析指针?,c++,boost,boost-serialization,C++,Boost,Boost Serialization,我计划制作像boost::archive::xml_-oachive这样的定制归档,我在boost/libs/serialization/example文件夹中找到了很好的示例 请参阅下一个代码(在上面的目录中有): //simple\u log\u archive.hpp ... 类简单日志存档 { ... 模板 结构保存原语 { 模板 静态无效调用(归档和应收账款、常量T&T) { //流式 } }; 模板 仅结构保存\u { 模板 静态无效调用(归档和应收账款、常量T&T) { 序列化:序

我计划制作像boost::archive::xml_-oachive这样的定制归档,我在boost/libs/serialization/example文件夹中找到了很好的示例

请参阅下一个代码(在上面的目录中有):

//simple\u log\u archive.hpp
...
类简单日志存档
{
...
模板
结构保存原语
{
模板
静态无效调用(归档和应收账款、常量T&T)
{
//流式
}
};
模板
仅结构保存\u
{
模板
静态无效调用(归档和应收账款、常量T&T)
{
序列化:序列化adl(ar、常量转换(t),
::boost::serialization::version::value);
}
};
模板
无效保存(常量T&T)
{
typedef BOOST_导出的TYPENAME BOOST::mpl::eval_如果,
boost::mpl::identity,
//否则
boost::mpl::identity
>>::键入typex;
typex::invoke(*this,t);
}  
公众:

//如果您所需要的只是如何将基类指针转换为派生类,那么应该这样做:
dynamic_cast(base)

Boost serialization具有单例类型特征映射。因此,不需要手动强制转换。我找到了一个解决方案。simple\u log\u archive.hpp只是基本mpl流的示例。如果您想创建一个自动强制转换的自定义存档,首先,继承详细信息::common\u oarchive或详细信息::common\u iarchive和实现。参考基本二进制/文本/xml\u archive.detail::common\u archive已经实现了一个指针转换过程。第二,定义BOOST\u CLASS\u导出(派生)。这个宏是make guid,这个guid用于detail::common\u archive以查找“true type”。最后,我仍然不知道为什么在没有register\u type()的情况下可以使用text\u oarchive,但必须为归档注册type。(ar.寄存器类型()
// simple_log_archive.hpp
...
class simple_log_archive
{
    ...
    template <class Archive>
    struct save_primitive
    {
        template <class T>
        static void invoke(Archive& ar, const T& t)
        {
            // streaming
        }
    };

    template <class Archive>
    struct save_only
    {
        template <class T>
        static void invoke(Archive& ar, const T& t)
        {
            boost::serialization::serialize_adl(ar, const_cast<T&>(t),
                ::boost::serialization::version<T>::value);
        }
    };

    template <class T>
    void save(const T& t)
    {
        typedef BOOST_DEDUCED_TYPENAME boost::mpl::eval_if<boost::is_enum<T>,
            boost::mpl::identity<save_enum_type<simple_log_archive> >,
        //else
        BOOST_DEDUCED_TYPENAME boost::mpl::eval_if<
            // if its primitive
                boost::mpl::equal_to<
                    boost::serialization::implementation_level<T>,
                    boost::mpl::int_<boost::serialization::primitive_type>
                >,
                boost::mpl::identity<save_primitive<simple_log_archive> >,
        // else
            boost::mpl::identity<save_only<simple_log_archive> >
        > >::type typex;
        typex::invoke(*this, t);
    }  
public:
    // the << operators 
    template<class T>
    simple_log_archive & operator<<(T const & t){
        m_os << ' ';
        save(t);
        return * this;
    }
    template<class T>
    simple_log_archive & operator<<(T * const t){
        m_os << " ->";
        if(NULL == t)
            m_os << " null";
        else
            *this << * t;
        return * this;
    }
    ...
};
Base* base = new Derived;
{
    boost::archive::text_oarchive ar(std::cout);
    ar << base;// Base pointer is auto casted to derived pointer! It's fine.
}

{
    simple_log_archive ar;
    ar << base;// Base pointer is not auto casting. This is my problem.
}